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

时间:2018-11-20 10:28:12

标签: xml wcf xpath biztalk

我正在从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>&lt;Invoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

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

1 个答案:

答案 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()='']

但是我可能仍然遇到问题,因为您的有效负载的其余部分似乎已经逃脱了,例如<是&lt;

相关问题