質問

使用したいと思いJDOM読みXMLファイルを使用し、XPathの抽出データからのJDOMます。このドキュメントオブジェクトがご利用する場合は、XPathの照会文書のリストの要素を取得しまいます。

私のXMLドキュメントにはデフォルトの名前空間を定義の関数はnullを戻します。面白いのは、私が去のデフォルト名前空間またはXPathのクエリを返します要素がってきた。他に何をすればよいでしたXPathのクエリーの結果を返します?

XML:

<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.foo.com">
<dvd id="A">
  <title>Lord of the Rings: The Fellowship of the Ring</title>
  <length>178</length>
  <actor>Ian Holm</actor>
  <actor>Elijah Wood</actor>
  <actor>Ian McKellen</actor>
</dvd>
<dvd id="B">
  <title>The Matrix</title>
  <length>136</length>
  <actor>Keanu Reeves</actor>
  <actor>Laurence Fishburne</actor>
</dvd>
</collection>

Java:

public static void main(String args[]) throws Exception {
    SAXBuilder builder = new SAXBuilder();
    Document d = builder.build("xpath.xml");
    XPath xpath = XPath.newInstance("collection/dvd");
    xpath.addNamespace(d.getRootElement().getNamespace());
    System.out.println(xpath.selectNodes(d));
}
役に立ちましたか?

解決

XPath1.0 をサポートしていないのコンセプトにデフォルト名前空間(XPath2.0 い).他の接頭辞の付かないタグは常に想定する問い合わせ名前

利用の場合 XPath1.0 必要なもののようになります:

public static void main(String args[]) throws Exception {
    SAXBuilder builder = new SAXBuilder();
    Document d = builder.build("xpath.xml");
    XPath xpath = XPath.newInstance("x:collection/x:dvd");
    xpath.addNamespace("x", d.getRootElement().getNamespaceURI());
    System.out.println(xpath.selectNodes(d));
}

他のヒント

私は似問題があったが、鉱山は、私はしませんでした定義された名前空間と他の人を持っていたそのうちのいくつかはXML入力、の混合物を持っていたことでした。私の問題を単純化するために、私は、ドキュメントをロードした後、次のJDOMスニペットを走っています。

for (Element el : doc.getRootElement().getDescendants(new ElementFilter())) {
    if (el.getNamespace() != null) el.setNamespace(null);
}

すべての名前空間を除去した後、私は、単純なのでGetChild( "elname")のスタイルのナビゲーションや簡単なXPathクエリを使用することができました。

私は一般的な解決策として、この手法をお勧めしませんが、私の場合、それは間違いなく有用であった。

また、次の操作を行うことができます。

/*[local-name() = 'collection']/*[local-name() = 'dvd']/

ここのリストはこちらです便利なXPathクエリます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top