使用体路径表达式从WCF-SQL消息中提取XML节点中的XML文档



我收到一条来自WCF-SQL适配器中SQL服务器的消息。在这个消息中有一个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>&lt;Invoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

我不确定如何将正确的xPath正确写入该节点。阅读MS文档上的文档似乎表明我需要使用本地名称语法。我认为我的问题在于在接收到的XML中使用名称空间,但我不知道如何将这些名称空间包括在xPath中。

您的第一个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()='']

但我认为你可能仍然有问题,因为看起来你的有效载荷的其余部分已经逃脱,例如<是&lt;

最新更新