Расшифровка XML-сообщения в кодировке base64, возвращенного из записи SQL в Biztalk - PullRequest
0 голосов
/ 16 ноября 2018

Я получаю документ в Biztalk, который содержит некоторое закодированное в base64 содержимое внутри тега 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="ID" 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:base64Binary"/>
                                            <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>
                            <ID>123</ID>
                            <hostUTC>2018-11-08T14:53:24.11Z</hostUTC>
                            <msgType>INVOIC</msgType>
                            <msgFormat>Edifact</msgFormat>
                            <msgbody>base64encodedmessage...</msgbody>
                            <fromID>DKT:28504861</fromID>
                            <toID>KMDoioUBL</toID>
                        </NewTable>
                    </NewDataSet>
                </diffgr:diffgram>
            </DataSet>
        </PolledData>
    </Polling>

Содержимое в кодировке base64 находится внутри тега. Я уже создал схему конверта, которая имеет следующую структуру:

enter image description here

Сообщение получено с использованием адаптера WCF-SQL в месте получения. В настоящее время не настроен конвейер для обработки сообщения. На вкладке «Сообщения» конфигурации адаптера кажется, что есть опция для кодирования base64, хотя я не уверен, что это делает или как именно работает. При использовании настройки тела здесь я получаю приведенный выше XML.

enter image description here

Я не уверен, что это можно сделать без написания кода. Читая этот пост по теме, кажется, что мне нужно написать собственный компонент конвейера для обработки декодирования. Но сначала мне нужно извлечь содержимое конкретного узла XML.

Я не уверен, как подойти к этой проблеме. Я хотел бы избежать использования оркестровок, если это вообще возможно. Это можно сделать в стандартном Biztalk, или мне нужно будет создать пользовательские функции для этого процесса?

Редактировать: 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()
...