【问题标题】:Deserialize an xml file or parse using linq to xml反序列化 xml 文件或使用 linq to xml 解析
【发布时间】:2018-10-15 20:39:29
【问题描述】:

我需要解码的简化 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);

        }

第一个 writeline 工作(它输出整个 XML 树),第二个说“System.Xml.Linq.XContainer.Element(...) 返回 null” - 我尝试使用 DELIVERIES、COUNT、Body 等。 .

显然我没有正确地告诉它如何遍历结构,但我不知道如何进一步处理它..

更新:感谢一些帮助,我已经弄清楚了如何使用 Linq 来做到这一点。 如果有人有指针,我仍然希望能够反序列化它。 我学习了几个教程,但是这个 XML 的多个级别似乎让我感到厌烦。

我已经创建了一个类来保存数据,但这就是我在这条道路上取得成功的程度。

谢谢你, 乔

【问题讨论】:

  • 我已经阅读了该页面以及其他十几个页面。我仍然无法弄清楚如何告诉它单步执行文件并为每个 DELIVERIES 节点(?)、元素(?)提取数据在我上面的代码中,地址在结果视图中只有一个条目。
  • This is very similar to what you want to do。将“t”替换为“DELIVERIES”,不要投射字符串选择。

标签: c# xml linq-to-xml


【解决方案1】:

谢谢 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();

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多