6

トランザクションのセッションを指定する ServiceGroupID という要素を SOAP ヘッダーから抽出したいと考えています。SOAPセッションを使用して同じサーバーにリクエストを送信できるようにするために、これが必要です。私のXMLは次のとおりです。

<?xml version="1.0" encoding="http://schemas.xmlsoap.org/soap/envelope/" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:ReplyTo>
<wsa:Address>http://www.w3.org/2005/08/addressing/none</wsa:Address>
<wsa:ReferenceParameters>
<axis2:ServiceGroupId xmlns:axis2="http://ws.apache.org/namespaces/axis2">urn:uuid:99A029EBBC70DBEB221347349722532</axis2:ServiceGroupId>
</wsa:ReferenceParameters>
</wsa:ReplyTo>
<wsa:MessageID>urn:uuid:99A029EBBC70DBEB221347349722564</wsa:MessageID>
<wsa:Action>Perform some action</wsa:Action>
<wsa:RelatesTo>urn:uuid:63AD67826AA44DAE8C1347349721356</wsa:RelatesTo>
</soapenv:Header>

Xpathを使用して上記のXMLからSession GroupIdを抽出する方法を知りたいです。

4

1 に答える 1

7

テクノロジを指定していないため、.NET NameSpace マネージャーなどに相当するものをセットアップしていないと仮定すると、名前空間に依存しない Xpath を次のように使用できます。

/*[local-name()='Envelope']/*[local-name()='Header']
      /*[local-name()='ReplyTo']/*[local-name()='ReferenceParameters']
      /*[local-name()='ServiceGroupId']/text()

Java用に更新された編集

名前空間エイリアスなし

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expression = xpath.compile("/*[local-name()='Envelope']/*[local-name()='Header']/*[local-name()='ReplyTo']/*[local-name()='ReferenceParameters']/*[local-name()='ServiceGroupId']/text()");
System.out.println(expression.evaluate(myXml));

NamespaceContextを使用

NamespaceContext context = new NamespaceContextMap(
    "soapenv", "http://schemas.xmlsoap.org/soap/envelope/", 
    "wsa", "http://www.w3.org/2005/08/addressing",
    "axis2", "http://ws.apache.org/namespaces/axis2");
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(context);
XPathExpression expression = xpath.compile("/soapenv:Envelope/soapenv:Header/wsa:ReplyTo/wsa:ReferenceParameters/axis2:Serv‌​iceGroupId/text()");
System.out.println(expression.evaluate(myXml));

local-name()その名前空間にとらわれない要素のタグ名を与えます。また、encoding上記の xml ドキュメントは正しくありません。

編集

これが定数であると仮定するとurn:uuid:、次の XPath は結果の最初の 9 文字を取り除きます (上記の XPath のいずれかと一緒に使用します)。一定でない場合urn:uuidは、トークン化/分割などを行う必要がありますが、これは私のスキルを超えています

substring(string(/*[local-name()='Envelope']/*[local-name()='Header']
                 /*[local-name()='ReplyTo']/*[local-name()='ReferenceParameters']
                 /*[local-name()='ServiceGroupId']/text()), 10)
于 2012-09-11T09:27:58.583 に答える