反序列化xml文件或使用linq解析为xml

时间:2018-10-15 20:39:29

标签: c# xml linq-to-xml

我需要解码的简化XML文件:

    <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:deliverylistResponse xmlns:ns2="http://tdriverap3.wsbeans.iseries/">
         <return>
            <COUNT>3</COUNT>
            <DELIVERIES>
               <ADD1>1300 address 1</ADD1>
               <CITY>NICE CITY</CITY>
               <ZIP>85705</ZIP>
            </DELIVERIES>
            <DELIVERIES>
               <ADD1>40 S PINAL PKWY AVE</ADD1>
               <CITY>FLORENCE</CITY>
               <ZIP>85132</ZIP>
            </DELIVERIES>
            <DELIVERIES>
               <ADD1>1825 EAST MAIN</ADD1>
               <CITY>CHANDLER</CITY>
               <ZIP>85286</ZIP>
            </DELIVERIES>
            <ERRORCODE/>
            <RUNDATE>09/26/2018</RUNDATE>
         </return>
      </ns2:deliverylistResponse>
   </soap:Body>
</soap:Envelope>

我正在使用以下代码尝试对代码中的每个地址进行解码。

我不知道如何访问它们。

XElement xelement = XElement.Load(@"e:\test\X2.xml");
        IEnumerable<XElement> addresses = xelement.Elements();

        foreach (var address in addresses)
        {
            Console.WriteLine(address);
            Console.WriteLine(address.Element("CITY").Value);

        }

第一个写行有效(它输出整个XML树),第二个写行表示“ System.Xml.Linq.XContainer.Element(...)返回null”-我尝试使用DELIVERIES,COUNT,Body等。

很明显,我没有正确地告诉它如何遍历该结构,但是我不知道该如何进行进一步的设计。

更新:由于有了一些帮助,我弄清楚了如何使用Linq做到这一点。 如果有人有指针,我仍然希望能够反序列化它。 我遵循了一些教程,但是这种XML的多个级别似乎让我失望。

我创建了一个用于保存数据的类,但是就我在该路径上获得的成功而言,就已经消失了。

谢谢你, 乔

1 个答案:

答案 0 :(得分:0)

谢谢Crowcoder-这就是我的初衷,它将起作用。 但是,实际的XML文件确实具有约60个字段,因此这不如使用反序列化例程好,但我至少可以继续进行该项目。

XElement xelement = XElement.Load(@"e:\test\x2.xml");

            IEnumerable<XElement> textSegs =
                 from seg in xelement.Descendants("DELIVERIES")
                  select seg;

            foreach (var address in textSegs)
            {
                Console.WriteLine(address.Element("ADD1").Value);
                Console.WriteLine(address.Element("CITY").Value);
                Console.WriteLine(address.Element("ZIP").Value);

            }


            Console.ReadKey();