0

これはそのような初心者の質問のように感じます。

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インスタンスに、「これをオフのままにするか、すべてが壊れます」というコメントが付いた呼び出しがあります。)

4

1 に答える 1

1

名前空間なしで解析している場合somePrefixは、式を除外する必要があります。

String expr = "/fixed/path/through/the/hierarchy/someTag";

これは、XPathが名前空間とローカル名で一致を実行するためであり、修飾名ではありません(これがgetNodeName()返されます)。XPath式にプレフィックスを付けると、XPathインタープリターはそれを使用して、名前空間マッピングから名前空間を取得します。マッピングを指定していないため、失敗します。

NODESETまた、子ノードを反復処理する場合は、おそらく使用することをお勧めします。

于 2013-01-11T16:19:21.027 に答える