これはそのような初心者の質問のように感じます。
XMLDOMを操作するJavaコードの山を見ています。(クラスは、JDK 7に同梱されている在庫org.w3c.dom.Document
などjavax.xml.xpath.XPath
です。)次のような場所がたくさんあります。
String expr = "/fixed/path/through/the/hierarchy";
// actual code reuses factory instances, etc
XPath xpath = XPathFactory.newInstance().newXPath();
Node topNode = someDocumentInstance.getFirstChild();
Node node = (Node) xpath.evaluate (expr, topNode, XPathConstants.NODE);
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeName().equalsIgnoreCase("somePrefix:someTag")) {
// "return child;" or otherwise break out of the loop
}
}
そして、それはすべて機能します。しかし、そのループは退屈な努力のようです。すでにXPathを使用してノードを取得している場合、既知のタグを探してそのノードの子を反復処理するのはなぜですか?
そこで、子ノードを直接フェッチするようにセクションを書き直そうとしました。ただし、を使用してクエリを実行する
String expr = "/fixed/path/through/the/hierarchy/somePrefix:someTag";
何にも一致しません。XPathConstants.NODESET
リクエストやなどのバリエーションを試しまし.STRING
たが、まだ結果がありません。(とにかく、これらのノードは1つだけである必要があります。)
ここで非常に明白な何かが欠けているように感じますが、親のクエリと子の手動ループが機能するときに、完全なクエリが失敗する理由を理解できません。XPathは、getNodeName()
そのようなクエリを使用する場合を超えて、ノードの品質をテストしていますか?
私が思いついた唯一の理論は、このプロジェクトでは使用されていないXML名前空間と関係があるというものです。(実際には.setNamespaceAware(false)
、DocumentBuilderFactoryインスタンスに、「これをオフのままにするか、すべてが壊れます」というコメントが付いた呼び出しがあります。)