0

私は以下のようなxmlを持っています:

<v2:Root xmlns:v2="www.example.com/xsd/">
<ABC>test data</ABC>
<ABC>test data1</ABC>
<ABC>test data2</ABC>
</v2:Root>

JDOM2 を使用して ABC 要素にアクセスしているときに、デバッグで要素の値を取得しています。

[Element:ABC[Namespace:"www.example.com/xsd/"]].

そのため、 Xpath 式 を使用しただけでは要素にアクセスできませんでした"//ABC"。式の使用を余儀なくされて"/*[local-name()='ABC']"います。その後、機能します。

今、私の要件は、式"//ABC"のみを使用して要素にアクセスすることです。何か方法はありますか?

助けてくれてありがとう。

4

1 に答える 1

0

XML が実際にどのように見えるかについて、あなたは間違っていると思います。私はあなたも持っている必要があると信じています:

xmlns="www.example.com/xsd/"

そうでなければ、あなたのABC要素はNO_NAMESPACE名前空間にあります(そして ABC toString() メソッドは次のようになります: [Element:ABC])

そのため、XML スニペットは ABC のElementtoString() 出力と一致しません。

質問を修正すると、XPath 式がどのように見えるべきかを提案しやすくなります。


編集、デフォルトの名前空間の追加の再定義があると私が正しいと仮定すると、次のJDOMを使用してABC要素を取得できます。

XPathFactory xpf = XPathFactory.instance();
Namespace defns = Namespace.getNamespace("defns", "www.example.com/xsd/");
XPathExpression<Element> xpe = xpf.compile("//defns:ABC", Filters.element(), null, defns);
List<Element> abcs = xpe.evaluate(doc);

XPath 仕様からの次の抜粋を注意深く読む必要があります。

ノード テストの QName は、式コンテキストからの名前空間宣言を使用して展開名に展開されます。これは、xmlns で宣言されたデフォルトの名前空間が使用されないことを除いて、開始タグと終了タグの要素タイプ名に対して展開が行われるのと同じ方法です: QName にプレフィックスがない場合、名前空間 URI は null です (これは同じです)。属性名が展開される方法)。QName にプレフィックスがあり、式のコンテキストに名前空間宣言がない場合はエラーです。

于 2013-11-19T06:55:31.663 に答える