2012-01-10 25 views
6

Body要素のxsi:type属性の値を返す正しいXPath式を判別しようとしています。私は運がなければすべてのように思えるものを試しました。私がこれを読んだことに基づいて、近いと思われるが、それは明らかに正しいquireではない。私は最後に安静に置くことができるように任意のクイックガイダンス?xpathでxsi:typeの値を取得する

//v20:Body/@xsi:type 

が、私はそれが

<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

Xpath式がうまく見えます。このXpathをXQUERYやXSLTなどで使用していますか?ここで問題となる可能性が最も高いのは、名前空間の接頭辞による混乱です。混乱の原因となる名前空間を排除する方法の1つは、xpathを次のように書き換えることです:// * [local-name()eq 'Body']/@ * [local-name()eq 'type'] –

+0

Murrayが正しいXPathのネームスペースを処理する方法は一般的に2つあります。最初に、 'local-name()'と 'namespace-uri()' XPath関数を使用します。標準のJAXPでは、接頭辞を名前空間にマップする適切に構成されたNamespaceContextを使用する必要があります。 –

答えて

2

ようv20:SmsMessageV1RequestBodyはコメントで指摘された戻りたい、2つの選択肢があります。

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

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

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

あなたが実際に使用するgetNamespaceURIを更新する必要があります:私は、次の名前空間宣言を仮定している

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)); 

注意値。

0

すべての素晴らしい回答/フィードバック。私の実際の問題は、夜の夜と新鮮な朝の午前中に解決されたようです。私はフィードバックを強化していきます。皆さんありがとう。

関連する問題