使用Xpath从SOAP标头中提取术语

Spa*_*d89 5 java xml xpath soap soapheader

我想从SOAP标头中提取一个名为ServiceGroupID的元素,它指定事务的会话.我需要这个,以便我可以使用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>
Run Code Online (Sandbox Code Playgroud)

我想知道如何使用Xpath从上面的XML中提取Session GroupId.

任何帮助将非常感谢.

Stu*_*tLC 7

您尚未指定技术,因此假设您尚未设置等效的.NET NameSpace管理器或类似技术,您可以使用命名空间无关的Xpath,如下所示:

/*[local-name()='Envelope']/*[local-name()='Header']
      /*[local-name()='ReplyTo']/*[local-name()='ReferenceParameters']
      /*[local-name()='ServiceGroupId']/text()
Run Code Online (Sandbox Code Playgroud)

编辑已更新为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));
Run Code Online (Sandbox Code Playgroud)

使用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));
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)