質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1443閲覧

XMLのタグ名が複数パターンある場合の検索方法

ConCon_

総合スコア12

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/08/29 06:45

編集2018/08/29 06:55

プログラミング、特にXMLに関しては素人のため、タイトルが適当ではないと思われます。すみません。

AmazonマーケットプレイスWebサービス(MWS)を使用し、
ISBNを入力すると返ってくるXMLを解析して、書籍名や著者名、サイズなどの情報を抽出したいと考えております。
XMLから書籍名など一部の情報を抽出するところまでは成功したのですが、
著者名やサイズなどを抽出することができません。

商品名など、抽出できている項目は、タグのパターンが一種類です。
(商品名→ns2:title、出版社ns2:Publisher

一方、抽出できない項目は、タグのパターンが複数種類あり、どのように指定すれば良いのかわかりません。
(著者名→<ns2:Creator Role="著"><ns2:Creator Role="翻訳"><ns2:Creator Role="Unknown">など、
サイズ→<ns2:Height Units="inches"><ns2:Height Units="pixels">など)
各項目ごとに、""の中以外は同じ文字列です。

こちらのAPIは同時に5つのISBNを送り、情報を取得できます。
そのため、5つのレスポンスすべてに<ns2:Creator Role="翻訳">のタグが含まれていれば問題ありませんが、
1つでも含まれていなかった場合、NullPointerExceptionが出てしまいます。
タグにどのようなパターンがあるかは不明ですので、
例外処理を行って全てのパターンを指定するという方法は、できれば避けたいです。
共通する文字列で部分一致などは可能でしょうか。
また、著者や翻訳が複数いる場合には、すべてを抽出したいです。

お力をかしていただけないでしょうか。
不足情報などがありましたら補足致しますので、ご指摘くださいませ。

【実行結果】
下記JAVAコードではエラーは出ず、商品名、ASIN、分類、出版社が下記のように返ってきます。

NATURE'S ROBOTS―それはタンパク質研究の壮大な歴史,4860434730,単行本(ソフトカバー),エヌ・ティー・エス

指定しているISBNは1つです。
著者・サイズは記載方法がわからず、いろいろ試しましたがNullPointerExceptionが返ってきてしまいます。
ISBNの受け渡しはメインメソッドで行っています。不要かと思い省いていますが、必要でしたらメインメソッドも記載致します。
例外処理は行っていませんが、後に記載するつもりです。

JAVA

1 public static void ExportXml() throws ParserConfigurationException, SAXException, IOException { //Xmlのノードを分析 2 String responseXml = GetMatchingProductForIdSample.responseXml; 3 4 InputSource inputSource = new InputSource(new StringReader(responseXml)); //String型をInputSource型に変換 5 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 6 DocumentBuilder builder = factory.newDocumentBuilder(); 7 Document doc = builder.parse(inputSource); 8 9 NodeList nodesTitle = doc.getElementsByTagName("ns2:Title"); //商品名 10 NodeList nodesAsin = doc.getElementsByTagName("ASIN"); //ASIN 11 NodeList nodesCreator = doc.getElementsByTagName("ns2:Creator Role=\".*\""); //著者、記載方法がわからず 12 NodeList nodesBinding = doc.getElementsByTagName("ns2:Binding"); //分類 13 NodeList nodesPublisher = doc.getElementsByTagName("ns2:Publisher"); //出版社 14 NodeList nodesHeight = doc.getElementsByTagName("ns2:Height Units=\"inches\""); //サイズ、記載方法がわからず 15 16 for(int i=0; i<nodesTitle.getLength();i++) 17 { 18 System.out.println(nodesTitle.item(i).getTextContent()+","+nodesAsin.item(i).getTextContent()+","+nodesBinding.item(i).getTextContent()+","+nodesPublisher.item(i).getTextContent()); 19 }

XML

1<GetMatchingProductForIdResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01"><GetMatchingProductForIdResult Id="9784860434731" IdType="ISBN" status="Success"><Products><Product><Identifiers><MarketplaceASIN><MarketplaceId>A1VC38T7YXB528</MarketplaceId><ASIN>4860434730</ASIN></MarketplaceASIN></Identifiers><AttributeSets><ns2:ItemAttributes xml:lang="ja-JP" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd"><ns2:Binding>単行本(ソフトカバー)</ns2:Binding><ns2:Creator Role="著">Charles Tanford</ns2:Creator><ns2:Creator Role="著">Jacqueline Reynolds</ns2:Creator><ns2:Creator Role="翻訳">浜窪 隆雄</ns2:Creator><ns2:Creator Role="翻訳">他5名</ns2:Creator><ns2:ItemDimensions><ns2:Height Units="inches">0.6692913379</ns2:Height><ns2:Length Units="inches">8.267716527</ns2:Length><ns2:Width Units="inches">5.8267716476</ns2:Width></ns2:ItemDimensions><ns2:IsAdultProduct>false</ns2:IsAdultProduct><ns2:Label>エヌ・ティー・エス</ns2:Label><ns2:Languages><ns2:Language><ns2:Name>japanese</ns2:Name><ns2:Type>Published</ns2:Type></ns2:Language></ns2:Languages><ns2:ListPrice><ns2:Amount>3024.00</ns2:Amount><ns2:CurrencyCode>JPY</ns2:CurrencyCode></ns2:ListPrice><ns2:Manufacturer>エヌ・ティー・エス</ns2:Manufacturer><ns2:NumberOfPages>342</ns2:NumberOfPages><ns2:PackageDimensions><ns2:Height Units="inches">0.8661417314</ns2:Height><ns2:Length Units="inches">8.4251968418</ns2:Length><ns2:Width Units="inches">5.9055118050</ns2:Width><ns2:Weight Units="pounds">1.0582188576</ns2:Weight></ns2:PackageDimensions><ns2:ProductGroup>Book</ns2:ProductGroup><ns2:ProductTypeName>ABIS_BOOK</ns2:ProductTypeName><ns2:PublicationDate>2018-03-30</ns2:PublicationDate><ns2:Publisher>エヌ・ティー・エス</ns2:Publisher><ns2:SmallImage><ns2:URL>http://ecx.images-amazon.com/images/I/61b3ceNG8jL._SL75_.jpg</ns2:URL><ns2:Height Units="pixels">75</ns2:Height><ns2:Width Units="pixels">53</ns2:Width></ns2:SmallImage><ns2:Studio>エヌ・ティー・エス</ns2:Studio><ns2:Title>NATURE'S ROBOTS―それはタンパク質研究の壮大な歴史</ns2:Title></ns2:ItemAttributes></AttributeSets><Relationships></Relationships><SalesRankings><SalesRank><ProductCategoryId>book_display_on_website</ProductCategoryId><Rank>361226</Rank></SalesRank><SalesRank><ProductCategoryId>500796</ProductCategoryId><Rank>74</Rank></SalesRank><SalesRank><ProductCategoryId>492162</ProductCategoryId><Rank>4523</Rank></SalesRank></SalesRankings></Product></Products></GetMatchingProductForIdResult><ResponseMetadata><RequestId>7efe54c2-8a52-4b16-9cef-466971ff6aa6</RequestId></ResponseMetadata></GetMatchingProductForIdResponse>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

タグ(要素)と属性がごっちゃになっているようです。
例えば <ns2:Creator Role="著"> の場合、以下のようになります。
(正確には名前空間(namespace)の説明も必要ですが、今回は不要なので省略)

  • タグ名(要素名): ns2:Creator
  • 属性名: Role
  • 属性値:

ソースコードを見ると doc.getElementsByTagName("ns2:Creator Role=\".*\"") と書かれていますが、引数に指定できるのはタグ名(要素名)だけです。なので、doc.getElementsByTagName("ns2:Creator")のようにする必要があります。

ではRoleはどのように取得するのかというと、 Element#getAttribute() メソッドを使う必要があります。また、<ns2:Creator ...></ns2:Creator> で囲まれたテキストは Element#getTextContent() メソッドを使って取得します。

最終的には以下のようにすれば取得できます(Creatorのみ対応)。

java

1// 省略 2NodeList nodesCreator = doc.getElementsByTagName("ns2:Creator"); 3// 省略 4 5for (int i = 0; i < nodesTitle.getLength(); i++) { 6 // 省略 7 8 for (int j = 0; j < nodesCreator.getLength(); j++) { 9 Element creator = (Element) nodesCreator.item(j); 10 String role = creator.getAttribute("Role"); 11 String creatorName = creator.getTextContent(); 12 System.out.println(role + ":" + creatorName); 13 } 14}

投稿2018/08/29 07:34

ikemo

総合スコア332

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ConCon_

2018/08/30 03:56

XMLは初めてだったのでよく理解できていませんでしたが、 大変わかりやすく教えていただき、ありがとうございました! おかげさまでやりかたかったように抽出することができました! またお力を貸して頂ければ嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問