我正在从WCF-SQL适配器中的SQL Server接收消息。在此消息中,有一个XML节点,其中包含一个完整格式的XML文档作为字符串。我需要的是仅提取此文档,而忽略正文的其余部分,以便可以通过管道进一步处理它。
我已经在适配器的配置设置的“ body path expression”输入字段中尝试了一堆xPath表达式,但是它们似乎都无法按我期望的方式工作。
我尝试过的一些xPath字符串:
/Polling/PolledData[1]/*[namespace-uri()='http://schemas.datacontract.org/2004/07/System.Data' and local-name()='DataSet'][1]/*[namespace-uri()='urn:schemas-microsoft-com:xml-diffgram-v1' and local-name()='diffgram'][1]/*[namespace-uri()='' and local-name()='NewDataSet'][1]/*[namespace-uri()='' and local-name()='NewTable'][1]/*[namespace-uri()='' and local-name()='msgbody'][1]
/*[local-name()='Polling']/*[local-name()='PolledData']/*[local-name()='DataSet']/*[local-name()='diffgram']/*[local-name()='NewDataSet']/*[local-name()='NewTable']/*[local-name()='msgbody']
/Polling/PolledData/DataSet/diffgr:diffgram/NewDataSet/NewTable/msgbody
//*[msgbody]/text()
我收到的XML文档的主体的结构是这样的,我试图从XML节点的末尾提取内容:
<Polling xmlns="http://schemas.microsoft.com/Sql/2008/05/Polling/">
<PolledData>
<DataSet xmlns="http://schemas.datacontract.org/2004/07/System.Data">
<xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element msdata:IsDataSet="true" name="NewDataSet">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="conversationID" type="xs:string"/>
<xs:element minOccurs="0" name="hostUTC" type="xs:dateTime"/>
<xs:element minOccurs="0" name="msgType" type="xs:string"/>
<xs:element minOccurs="0" name="acknowledgment" type="xs:string"/>
<xs:element minOccurs="0" name="sendLog" type="xs:string"/>
<xs:element minOccurs="0" name="msgFormat" type="xs:string"/>
<xs:element minOccurs="0" name="msgbody" type="xs:string"/>
<xs:element minOccurs="0" name="fromID" type="xs:string"/>
<xs:element minOccurs="0" name="toID" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet xmlns="">
<NewTable>
<conversationID>b4327577-14d1-478d-9e22-027683c0c5f9</conversationID>
<hostUTC>2018-11-19T13:17:07.03Z</hostUTC>
<msgType>INVOIC</msgType>
<msgFormat>oioUBL</msgFormat>
<msgbody><Invoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
我不确定如何将正确的xPath正确写入此节点。阅读MS docs上的文档似乎表明我需要使用本地名称语法。我认为我的问题在于在接收到的XML中使用名称空间,但是我不知道如何在xPath中包含这些名称空间。
答案 0 :(得分:1)
您的第一个XPath几乎是正确的,除了您缺少前两个节点的名称空间。
在您的XPath示例中,第一个[1]
也是必需的,除非有多个节点并且您希望选择第一个。
正确的Xpath应该是
/*[local-name()='Polling' and namespace-uri()='http://schemas.microsoft.com/Sql/2008/05/Polling/']
/*[local-name()='PolledData' and namespace-uri()='http://schemas.microsoft.com/Sql/2008/05/Polling/']
/*[local-name()='DataSet' and namespace-uri()='http://schemas.datacontract.org/2004/07/System.Data']
/*[local-name()='diffgram' and namespace-uri()='urn:schemas-microsoft-com:xml-diffgram-v1']
/*[local-name()='NewDataSet' and namespace-uri()='']
/*[local-name()='NewTable' and namespace-uri()='']
/*[local-name()='msgbody' and namespace-uri()='']
但是我可能仍然遇到问题,因为您的有效负载的其余部分似乎已经逃脱了,例如<是<