7

xsi:type要素の属性の値を返すための正しい XPath 式を決定しようとしていBodyます。私は運が悪いと思われることをすべて試しました。私が読んだことに基づいて、これは近いように見えますが、明らかに正確ではありません. 最終的に休むことができるように、簡単なガイダンスはありますか?

//v20:Body/@xsi:type

返してほしいv20:SmsMessageV1RequestBody

<v20:MessageV1Request>
    <v20:Header>
        <v20:Source>
            <v20:Name>SOURCE_APP</v20:Name>
            <v20:ReferenceId>1326236916621</v20:ReferenceId>
            <v20:Principal>2001</v20:Principal>
        </v20:Source>
    </v20:Header>
    <v20:Body xsi:type="v20:SmsMessageV1RequestBody">
        <v20:ToAddress>5555551212</v20:ToAddress>
        <v20:FromAddress>11111</v20:FromAddress>
        <v20:Message>TEST</v20:Message>
    </v20:Body>
</v20:MessageV1Request>
4

2 に答える 2

2

コメントで指摘されているように、2 つの選択肢があります。

  1. local-name()名前空間に関係なくターゲット ノードを参照するために使用します。
  2. すべての名前空間を XPath エンジンに適切に登録する

Javaで後者を行う方法は次のとおりです。

XPath xpath = XPathFactory.newInstance().newXPath();
NamespaceContext ctx = new NamespaceContext() {
    public String getNamespaceURI(String prefix) {
        if ("v20".equals(prefix)) {
            return "testNS1";
        } else if ("xsi".equals(prefix)) {
            return "http://www.w3.org/2001/XMLSchema-instance";
        }
        return null;
    }
    public String getPrefix(String uri) {
        throw new UnsupportedOperationException();
    }
    public Iterator getPrefixes(String uri) {
        throw new UnsupportedOperationException();
    }
};
xpath.setNamespaceContext(ctx);
XPathExpression expr = xpath.compile("//v20:Body/@xsi:type");       
System.out.println(expr.evaluate(doc, XPathConstants.STRING));

次の名前空間宣言を想定していることに注意してください。

<v20:MessageV1Request xmlns:v20="testNS1" 
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

getNamespaceURI実際の値を使用するには、更新する必要があります。

于 2012-01-11T19:01:23.503 に答える
0

すべての素晴らしい回答/フィードバック。私の実際の問題は、夜を過ごして朝にビルドすることで解決したようです。フィードバックをもとに改善していきます。皆さんありがとう。

于 2012-01-11T19:47:18.030 に答える