0

XPath を使用して xmel ファイルから属性の値を取得しようとしていますが、どこが間違っているのかわかりません..

これは XML ファイルです

<soapenv:Envelope>
  <soapenv:Header>
    <common:TestInfo testID="PI1" />
  </soapenv:Header>
</soapenv:Envelope>

そして、これは私が値を取得するために使用しているコードです。これらはどちらも何も返しません..

XPathBuilder getTestID = new XPathBuilder("local-name(/*[local-name(.)='Envelope']/*[local-name(.)='Header']/*[local-name(.)='TestInfo'])");
XPathBuilder getTestID2 = new XPathBuilder("Envelope/Header/TestInfo/@testID");

Object doc2 = getTestID.evaluate(context, sourceXML);
Object doc3 = getTestID2.evaluate(context, sourceXML);

testID の値を取得するにはどうすればよいですか?

4

4 に答える 4

0

ただし、Java 内で反復処理を行っている場合、コンテキスト ノードはおそらくあなたが考えているものではないため、「.」を削除します。local-name(.)あなたのような指定子:

/*[local-name()='Header']/*[local-name()='TestInfo']/@testIDakaIDIOT が言うように、表示<Envelope>されるタグはありませんが、あなたの XML でうまくいきました。

于 2013-02-08T15:28:39.293 に答える
0

名前空間を気にせず、XPath 2.0 互換エンジンを使用する場合は、それを使用*してください。

//*:Header/*:TestInfo/@testID

目的の入力を返します。

必要な名前空間 (ここでは説明しません。XPath エンジンによって異なります) を登録し、これらを使用してクエリを実行する方がおそらくよりエレガントです。

//soapenv:Header/common:TestInfo/@testID
于 2013-02-08T15:43:48.053 に答える
0

最初の XPath にはlocal-name()、全体をラップするエクストラがあります。

local-name(/*[local-name(.)='Envelope']/*[local-name(.)='Header']
                                                         /*[local-name(.)='TestInfo'])

この XPath の結果は、TestInfoノードが見つかった場合は文字列値 "TestInfo" になり、見つからなかった場合は空白の文字列になります。

あなたが言うようにXMLが構造化されている場合、これはうまくいくはずです:

/*[local-name()='Envelope']/*[local-name()='Header']/*[local-name()='TestInfo']/@testID

ただし、 (ab)using ではなく、名前空間を適切に操作する必要がありますlocal-name()。Java でこれを行う方法を示す投稿がここにあります。

于 2013-02-08T17:19:00.647 に答える
0

提供された XML ファイルには<Envelope>要素が含まれていないため、それを必要とする式は決して一致しません。

事後編集

XML スニペットからわかるように、ドキュメントは、一致させようとしている要素に対して特定の名前空間を使用しています。XPath エンジンは名前空間を認識します。つまり、必要なものを正確に尋ねる必要があります。また、名前空間は省略形ではなくuri によって定義されることに注意してください (そのため、/namespace:element名前空間が何を参照しているかを XPath エンジンに知らせない限り、あまり効果がありませんnamespace)。

于 2013-02-08T15:20:50.303 に答える