【问题标题】:Can't get path to XML element in SOAP无法在 SOAP 中获取 XML 元素的路径
【发布时间】:2018-11-26 06:51:12
【问题描述】:

我有一个供 VB.NET 读取的 XML 文件。我的代码特定于文件。

如何读取与<Key> LNGYIL 关联的<Value> 的值?

我的代码:

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>

目前我什么也得不到。

【问题讨论】:

标签: xml vb.net soap xsd


【解决方案1】:

您需要对其进行编码以处理命名空间。一种方法是像这样使用 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

附:我怀疑xmlns="http://integration.univera.com.tr" 无效,它应该类似于xmlns:univera="http://integration.univera.com.tr"。这种变化使以下事情成为可能......

第二种选择

您可以像这样使用XmlNamespaceManager,而不是使用 Imports 语句:

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 查询的工作可以让您直接获取值,而无需在其后进行循环。


参考:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多