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

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

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

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

Java

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

Q&A

1回答

3257閲覧

java dom4jでW3Cのメソッドを使用したい

nnozomi

総合スコア7

XML

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

Java

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

0グッド

0クリップ

投稿2016/08/26 03:45

状況
dom4jを使用して、XMLファイルを加工しています。
W3Cでなく、dom4jを使用しているのは、xPathを使用する必要があるためです。
しかし、dom4jではメソッドが十分ではありません。
素人なりに調べたところ、dom4j.dom のDOMElementで上記を実現できる気がしている
のですが、DOMElementの実装の仕方が全くわかりません。

DOMElement

以下のコードをDOMElementを用いて書き直したいのですが、どうしたらよいでしょうか。
そもそも検討違いなことをいっているかもしれませんが、そうであればご指摘ください。

コード

import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class Sampe1 { public static void main(String[] args) { SAXReader reader = new SAXReader(); try { Document document = reader.read("catalog.xml"); List books =document.selectNodes("catalog/book"); for(Iterator i = books.iterator(); i.hasNext();){ Node book = (Node)i.next(); List aList = book.selectNodes("./a"); for(Iterator i2 = aList.iterator(); i2.hasNext();){ Node aNode = (Node)i2.next(); int aInt = Integer.parseInt( aNode.valueOf("./@volume")); //以下一文、getNextSiblingで書き換えたい。 Node NextSiblingNode= aNode.selectSingleNode("./following-sibling::*"); int nextInt = Integer.parseInt(NextSiblingNode.valueOf("./@volume")); // //以下 DOMElementのhasAttributeを使って以下のことをしたい。このままではエラー // if(aNode.hasAttribute("volume");){ // if(NextSiblingNode.hasAttribute("volume")){ // if(aInt > nextInt){ // System.out.println(aInt+"is larger than"+ nextInt); // } // } // } }

読み込んだXML(catalog.xml)

<catalog> <book> <a num = "1" volume = "10">Gambardella, Matthew</a> <a num = "2" volume = "7">XML Developer's Guide</a> <a num = "3" volume = "3">Computer</a> <a num = "4">44.95</a> <a num = "5">2000-10-01</a> <a num = "6">An in-depth look at creating applications with XML.</a> </book> <book> <a num = "3" volume = "3">Fantasy</a> <a num ="4" >5.95</a> <a num = "5">2000-12-16</a> <a num = "6">A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</a> </book> <book> <a num = "4">5.95</a> <a num = "5">2000-11-17</a> <a num = "6">After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</a> </book> </catalog>

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

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

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

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

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

guest

回答1

0

いくつか遠回りしているコードと、値が取得できなかった時の制御ができていない箇所があるようです。

例えば document.selectNodesで取得した内容はXMLの 要素 とわかるので、Nodeではなく、Elementで取得できます。

java

1List books = document.selectNodes("catalog/book"); 2for (Iterator i = books.iterator(); i.hasNext();) { 3 Element book = (Element) i.next(); 4 List aList = book.selectNodes("./a"); 5 for (Iterator i2 = aList.iterator(); i2.hasNext();) { 6 Element aNode = (Element) i2.next(); 7.......

また、属性値volumeを取得した際に、もしvolume属性そのものがない要素だった場合に、NumberFormatExceptionが出るでしょう。例えば以下のコードです。

int aInt = Integer.parseInt(aNode.valueOf("./@volume"));

この場合、次のように退避するか、そのループの次へ行くなどの対応をすればよいでしょう。

java

1Element aNode = (Element) i2.next(); 2String aNodeValue = aNode.valueOf("./@volume"); 3if ( aNodeValue == null || "".equals(aNodeValue)) { 4 continue; 5}

まとめると以下のようになるかと。

java

1import org.dom4j.Document; 2import org.dom4j.DocumentException; 3import org.dom4j.Element; 4import org.dom4j.Node; 5import org.dom4j.io.SAXReader; 6 7import java.util.Iterator; 8import java.util.List; 9 10public class Dom4jSample { 11 12 public void loadAndUpdate() throws DocumentException { 13 SAXReader reader = new SAXReader(); 14 15 String path = Thread.currentThread().getContextClassLoader().getResource("").getPath(); 16 17 Document document = reader.read(path + "catalog.xml"); 18 19 List books = document.selectNodes("catalog/book"); 20 for (Iterator i = books.iterator(); i.hasNext();) { 21 Element book = (Element) i.next(); 22 List aList = book.selectNodes("./a"); 23 for (Iterator i2 = aList.iterator(); i2.hasNext();) { 24 Element aNode = (Element) i2.next(); 25 String aNodeValue = aNode.valueOf("./@volume"); 26 if ( aNodeValue == null || "".equals(aNodeValue)) { 27 continue; 28 } 29 int aInt = Integer.parseInt(aNodeValue); 30 31 // 以下一文、getNextSiblingで書き換えたい。 32 Node nextSiblingNode = aNode.selectSingleNode("./following-sibling::*"); 33 String volume = nextSiblingNode.valueOf("./@volume"); 34 35 if ( volume == null || "".equals(volume)) { 36 continue; 37 } 38 39 int nextInt = Integer.parseInt(volume); 40 if (aInt > nextInt) { 41 System.out.println(aInt+"is larger than"+ nextInt); 42 } 43 } 44 } 45 } 46 47 public static void main(String g[]) throws Exception { 48 Dom4jSample sample = new Dom4jSample(); 49 sample.loadAndUpdate(); 50 } 51}

投稿2016/08/26 10:20

A-pZ

総合スコア12011

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問