无法使用 LINQ to XML 循环访问 xml 文档

Unable to use LINQ to XML to loop through xml document

提问人:user1647160 提问时间:3/5/2021 更新时间:3/5/2021 访问量:78

问:

我正在尝试使用 LINQ 获取以下 XML 文档的元素值,但收到“对象引用未设置为对象的实例”。

XML格式:

<soapenv:Envelope xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/ 
xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance>

   <soapenv:Body>

  <ns1:GetContactResponse soapenv:encodingStyle=http://schemas.xmlsoap.org/soap/encoding/ xmlns:ns1=http://DefaultNamespace>

     <GetContactReturn xsi:type="ns2:Response" xmlns:ns2=http://getContact.contact.V300>

        <Contact xsi:type="ns3:Contact" xmlns:ns3=http://_contact.contact.V300>

           <Address xsi:type="xsd:string">123 test</Address>

           <Address2 xsi:type="xsd:string"/>

           <City xsi:type="xsd:string">Los Angeles</City>

           <CountryCode xsi:type="xsd:string">US</CountryCode>

           <StateCode xsi:type="xsd:string">CA</StateCode>

           <ZipCode xsi:type="xsd:string">90001</ZipCode>

        </Contact>

        <Errors soapenc:arrayType="ns4:Error[0]" xsi:type="soapenc:Array" xmlns:ns4=http://response.base.V300 xmlns:soapenc=http://schemas.xmlsoap.org/soap/encoding//>

        <IsSuccessful xsi:type="xsd:boolean">true</IsSuccessful>

        <RecordCount xsi:type="xsd:double">1.0</RecordCount>

     </GetContactReturn>

  </ns1:GetContactResponse>

   </soapenv:Body>

 </soapenv:Envelope>

我正在使用以下内容进行循环:

using (StreamReader rd = new StreamReader(services.GetResponseStream()))

   {
                        var ServiceResult = rd.ReadToEnd();

                        XDocument xdoc = new XDocument();

                        xdoc = XDocument.Parse(ServiceResult);

                        var xDocResult = (from x in xdoc.Descendants("Contacts")

                                          select new Location

                                          {

                                              Address = x.Element("Address").Value,

                                              Address2 = x.Element("Address2").Value,

                                              city = x.Element("City").Value,

                                              statecode = x.Element("StateCode").Value,

                                              zipcode = x.Element("ZipCode").Value

                                          });
}

我假设这是因为没有根。如何获取各个元素的值?

C# XML SOAP Linq-to-XML

评论


答:

1赞 jdweng 3/5/2021 #1

你的 xml 有很多错误。我正在使用 StringReader。应替换为 StreamReader。这是更正

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ns1:GetContactResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://DefaultNamespace">
      <GetContactReturn xsi:type="ns2:Response" xmlns:ns2="http://getContact.contact.V300">
        <Contact xsi:type="ns3:Contact" xmlns:ns3="http://_contact.contact.V300">
          <Address xsi:type="xsd:string">123 test</Address>
          <Address2 xsi:type="xsd:string"/>
          <City xsi:type="xsd:string">Los Angeles</City>
          <CountryCode xsi:type="xsd:string">US</CountryCode>
          <StateCode xsi:type="xsd:string">CA</StateCode>
          <ZipCode xsi:type="xsd:string">90001</ZipCode>
        </Contact>
        <Errors soapenv:arrayType="ns4:Error[0]" xsi:type="soapenc:Array" xmlns:ns4="http://response.base.V300 xmlns:soapenc=http://schemas.xmlsoap.org/soap/encoding"/>
        <IsSuccessful xsi:type="xsd:boolean">true</IsSuccessful>
        <RecordCount xsi:type="xsd:double">1.0</RecordCount>
      </GetContactReturn>
    </ns1:GetContactResponse>
  </soapenv:Body>
</soapenv:Envelope>

下面是 c# 代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            StringReader reader = new StringReader(xml);

            XDocument doc = XDocument.Load(reader);

            XElement contact = doc.Descendants().Where(x => x.Name.LocalName == "Contact").FirstOrDefault();
            XNamespace ns = contact.GetDefaultNamespace();

            string address = (string)contact.Element(ns + "Address");
            string address2 = (string)contact.Element(ns + "Address2");
            string city = (string)contact.Element(ns + "City");
            string country = (string)contact.Element(ns + "CountryCode");
            string state = (string)contact.Element(ns + "StateCode");
            string zip = (string)contact.Element(ns + "ZipCode");

        }
    }
}

评论

0赞 user1647160 3/5/2021
我正在从 API 使用它。如何将其转换为字符串?
0赞 jdweng 3/5/2021
load 方法将采用一个流:XDocument doc = XDocument.Load(stream);
0赞 user1647160 3/5/2021
我能够让它与您的解决方案一起使用。如果您将其添加为我帖子的答案,我会将其标记为解决方案。