Извлечение документа XML в узел XML из сообщения WCF-SQL с использованием выражения пути к телу - PullRequest
0 голосов
/ 20 ноября 2018

Я получаю сообщение от сервера SQL в адаптере WCF-SQL.В этом сообщении есть узел XML, который содержит полностью отформатированный документ XML в виде строки.Что мне нужно, так это извлечь только этот документ, игнорируя остальную часть тела, чтобы он мог обрабатываться далее конвейером.

Я пробовал несколько выражений 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 голосов
/ 21 ноября 2018

Ваш первый XPath был почти верным, за исключением того, что вы пропустили из него пространства имен для первых двух узлов.

Кроме того, [1] в ваших первых ваших примерах XPath необходимы, если нет нескольких узлови вы хотите выбрать первый.

Правильный 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()='']

Но у вас все еще может быть проблема, так как похоже, что остальная часть вашего полезного груза сбежала,например, <является <code>&lt;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...