Не удается получить путь к элементу XML в SOAP - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть XML-файл для VB.NET для чтения.Мой код относится к файлу.

Как я могу прочитать значение <Value>, связанное с <Key> LNGYIL?

enter image description here

Мой код:

Dim doc As XDocument
        doc = XDocument.Load("c:\jpan\faturalar.xml")
        Dim lngyil= (
       From v In doc.<soap>.<soap>.<IntegrationGetEntitySetWithPacketLoginResponse>.<IntegrationGetEntitySetWithPacketLoginResult>.<ResultEntitySet>.<CustomData>.<ArrayOfClsDictionaryOfStringObject>.<clsDictionaryOfStringObject>
       Where v.<Key>.Value = "LNGYIL"
       Select v.<Value>.Value
            ).Single()
        ListBox1.Items.Insert(0, lngyil)

Источник XML:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><IntegrationGetEntitySetWithPacketLoginResponse xmlns="http://integration.univera.com.tr"><IntegrationGetEntitySetWithPacketLoginResult><ResultString>OK</ResultString><IsSuccess>true</IsSuccess><ResultEntitySet><GorevSonucBilgiler/><DistUnvan/><PaketAdi/><Warnings/><PaketTanimlar><clsPaketTanim><Kod xsi:nil="true"/><Tabloadi>CUSTOMVIEW_ENTVIEWFATURAGENERIC_OZGUN</Tabloadi><Viewadi>CUSTOMVIEW_ENTVIEWFATURAGENERIC_OZGUN</Viewadi><Yon xsi:nil="true"/><Kriter>"(LNGDISTKOD = 12) AND BYTTUR IN(0,1) AND (LNGYIL = 2018) AND (BYTDURUM = 0)"</Kriter><Durum xsi:nil="true"/></clsPaketTanim></PaketTanimlar><SatirBazliTransaction>false</SatirBazliTransaction><LogKategori>0</LogKategori><IntegrationGorevSonucTip>0</IntegrationGorevSonucTip><errorLoglist/><SCCall>false</SCCall><ReturnLoglist>false</ReturnLoglist><StokSil>false</StokSil><CustomData><ArrayOfClsDictionaryOfStringObject><clsDictionaryOfStringObject><Key>LNGYIL</Key><Value xsi:type="xsd:int">2018</Value></clsDictionaryOfStringObject><clsDictionaryOfStringObject><Key>LNGDISTKOD</Key><Value xsi:type="xsd:int">12</Value></clsDictionaryOfStringObject><clsDictionaryOfStringObject><Key>TXTDISTKOD</Key><Value xsi:type="xsd:string">SH012</Value></clsDictionaryOfStringObject><clsDictionaryOfStringObject><Key>TXTSTKOD</Key><Value xsi:type="xsd:string">SH010</Value></clsDictionaryOfStringObject></ArrayOfClsDictionaryOfStringObject></CustomData></ResultEntitySet></IntegrationGetEntitySetWithPacketLoginResult></IntegrationGetEntitySetWithPacketLoginResponse></soap:Body></soap:Envelope>

В настоящее время я ничего не получаю.

1 Ответ

0 голосов
/ 26 ноября 2018

Вам нужно кодировать его, чтобы иметь дело с пространствами имен.Одним из способов является использование операторов Imports, таких как:

Imports <xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
Imports <xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Imports <xmlns:xsd="http://www.w3.org/2001/XMLSchema">
Imports <xmlns="http://integration.univera.com.tr">

Module Module1

    Sub Main()
        Dim x As XElement = <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                                <soap:Body>
                                    <IntegrationGetEntitySetWithPacketLoginResponse xmlns="http://integration.univera.com.tr">
                                        <IntegrationGetEntitySetWithPacketLoginResult>
                                            <ResultString>OK</ResultString>
                                            <IsSuccess>true</IsSuccess>
                                            <ResultEntitySet>
                                                <GorevSonucBilgiler/>
                                                <DistUnvan/>
                                                <PaketAdi/>
                                                <Warnings/>
                                                <PaketTanimlar>
                                                    <clsPaketTanim>
                                                        <Kod xsi:nil="true"/>
                                                        <Tabloadi>CUSTOMVIEW_ENTVIEWFATURAGENERIC_OZGUN</Tabloadi>
                                                        <Viewadi>CUSTOMVIEW_ENTVIEWFATURAGENERIC_OZGUN</Viewadi>
                                                        <Yon xsi:nil="true"/>
                                                        <Kriter>"(LNGDISTKOD = 12) AND BYTTUR IN(0,1) AND (LNGYIL = 2018) AND (BYTDURUM = 0)"</Kriter>
                                                        <Durum xsi:nil="true"/>
                                                    </clsPaketTanim>
                                                </PaketTanimlar>
                                                <SatirBazliTransaction>false</SatirBazliTransaction>
                                                <LogKategori>0</LogKategori>
                                                <IntegrationGorevSonucTip>0</IntegrationGorevSonucTip>
                                                <errorLoglist/>
                                                <SCCall>false</SCCall>
                                                <ReturnLoglist>false</ReturnLoglist>
                                                <StokSil>false</StokSil>
                                                <CustomData>
                                                    <ArrayOfClsDictionaryOfStringObject>
                                                        <clsDictionaryOfStringObject>
                                                            <Key>LNGYIL</Key>
                                                            <Value xsi:type="xsd:int">2018</Value>
                                                        </clsDictionaryOfStringObject>
                                                        <clsDictionaryOfStringObject>
                                                            <Key>LNGDISTKOD</Key>
                                                            <Value xsi:type="xsd:int">12</Value>
                                                        </clsDictionaryOfStringObject>
                                                        <clsDictionaryOfStringObject>
                                                            <Key>TXTDISTKOD</Key>
                                                            <Value xsi:type="xsd:string">SH012</Value>
                                                        </clsDictionaryOfStringObject>
                                                        <clsDictionaryOfStringObject>
                                                            <Key>TXTSTKOD</Key>
                                                            <Value xsi:type="xsd:string">SH010</Value>
                                                        </clsDictionaryOfStringObject>
                                                    </ArrayOfClsDictionaryOfStringObject>
                                                </CustomData>
                                            </ResultEntitySet>
                                        </IntegrationGetEntitySetWithPacketLoginResult>
                                    </IntegrationGetEntitySetWithPacketLoginResponse>
                                </soap:Body>
                            </soap:Envelope>

        Dim doc = New XDocument(x)

        Dim q = doc.<soap:Envelope>.<soap:Body>.<IntegrationGetEntitySetWithPacketLoginResponse>.<IntegrationGetEntitySetWithPacketLoginResult>.<ResultEntitySet>.<CustomData>.<ArrayOfClsDictionaryOfStringObject>.<clsDictionaryOfStringObject>

        Dim lngyil = (
                       From v In q
                       Where v.<Key>.Value = "LNGYIL"
                       Select v.<Value>.Value
                     ).Single()

        Console.WriteLine(lngyil)

        Console.ReadLine()

    End Sub

End Module

Выходы:

2018

PS У меня подозрение что xmlns="http://integration.univera.com.tr" недопустимо, и должно быть что-то вроде xmlns:univera="http://integration.univera.com.tr".Это изменение делает возможным следующее ...

Второй параметр

Вместо использования операторов Imports вы можете использовать XmlNamespaceManager , например так:

Imports System.Xml
Imports System.Xml.XPath

Module Module1

    Sub Main()
        Dim x As XElement = <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                                <soap:Body>
                                    <IntegrationGetEntitySetWithPacketLoginResponse xmlns:univera="http://integration.univera.com.tr">
                                        <IntegrationGetEntitySetWithPacketLoginResult>
                                            <ResultString>OK</ResultString>
                                            <IsSuccess>true</IsSuccess>
                                            <ResultEntitySet>
                                                <GorevSonucBilgiler/>
                                                <DistUnvan/>
                                                <PaketAdi/>
                                                <Warnings/>
                                                <PaketTanimlar>
                                                    <clsPaketTanim>
                                                        <Kod xsi:nil="true"/>
                                                        <Tabloadi>CUSTOMVIEW_ENTVIEWFATURAGENERIC_OZGUN</Tabloadi>
                                                        <Viewadi>CUSTOMVIEW_ENTVIEWFATURAGENERIC_OZGUN</Viewadi>
                                                        <Yon xsi:nil="true"/>
                                                        <Kriter>"(LNGDISTKOD = 12) AND BYTTUR IN(0,1) AND (LNGYIL = 2018) AND (BYTDURUM = 0)"</Kriter>
                                                        <Durum xsi:nil="true"/>
                                                    </clsPaketTanim>
                                                </PaketTanimlar>
                                                <SatirBazliTransaction>false</SatirBazliTransaction>
                                                <LogKategori>0</LogKategori>
                                                <IntegrationGorevSonucTip>0</IntegrationGorevSonucTip>
                                                <errorLoglist/>
                                                <SCCall>false</SCCall>
                                                <ReturnLoglist>false</ReturnLoglist>
                                                <StokSil>false</StokSil>
                                                <CustomData>
                                                    <ArrayOfClsDictionaryOfStringObject>
                                                        <clsDictionaryOfStringObject>
                                                            <Key>LNGYIL</Key>
                                                            <Value xsi:type="xsd:int">2018</Value>
                                                        </clsDictionaryOfStringObject>
                                                        <clsDictionaryOfStringObject>
                                                            <Key>LNGDISTKOD</Key>
                                                            <Value xsi:type="xsd:int">12</Value>
                                                        </clsDictionaryOfStringObject>
                                                        <clsDictionaryOfStringObject>
                                                            <Key>TXTDISTKOD</Key>
                                                            <Value xsi:type="xsd:string">SH012</Value>
                                                        </clsDictionaryOfStringObject>
                                                        <clsDictionaryOfStringObject>
                                                            <Key>TXTSTKOD</Key>
                                                            <Value xsi:type="xsd:string">SH010</Value>
                                                        </clsDictionaryOfStringObject>
                                                    </ArrayOfClsDictionaryOfStringObject>
                                                </CustomData>
                                            </ResultEntitySet>
                                        </IntegrationGetEntitySetWithPacketLoginResult>
                                    </IntegrationGetEntitySetWithPacketLoginResponse>
                                </soap:Body>
                            </soap:Envelope>

        Dim doc = New XDocument(x)

        Dim nt As NameTable = New NameTable()
        Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(nt)
        nsmgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/")
        nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")
        nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema")
        nsmgr.AddNamespace("univera", "http://integration.univera.com.tr")

        Dim a = doc.XPathSelectElements("/soap:Envelope/soap:Body/IntegrationGetEntitySetWithPacketLoginResponse/IntegrationGetEntitySetWithPacketLoginResult/ResultEntitySet/CustomData/ArrayOfClsDictionaryOfStringObject/clsDictionaryOfStringObject", nsmgr)
        Dim lngyil2 = (
                       From v In a
                       Where v.XPathSelectElement("Key").Value = "LNGYIL"
                       Select v.XPathSelectElement("Value").Value
                     ).Single()

        Console.WriteLine(lngyil2)

        Console.ReadLine()

    End Sub

End Module

Дальнейшая работа над запросом XPath позволит вам получить значение непосредственно без цикла после него.


Refs:

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