反序列化 xml 文件或使用 linq 解析到 xml
Deserialize an xml file or parse using 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);
}
第一个 writeline 工作(它输出整个 XML 树),第二个说 "System.Xml.Linq.XContainer.Element(...) returned null" - 我试过使用 DELIVERIES、COUNT、Body 等...
显然我没有正确地告诉它如何遍历结构,但我不知道如何进一步处理它..
更新:感谢一些帮助,我已经弄清楚如何使用 Linq 来完成它。
如果有人有指针,我仍然希望能够反序列化它。
我遵循了几个教程,但是这个 XML 的多个级别似乎让我失望了。
我创建了一个 class 来保存数据,但这就是我在这条道路上取得的成功。
谢谢,
乔
谢谢 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();
我需要解码的简化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(...) returned null" - 我试过使用 DELIVERIES、COUNT、Body 等...
显然我没有正确地告诉它如何遍历结构,但我不知道如何进一步处理它..
更新:感谢一些帮助,我已经弄清楚如何使用 Linq 来完成它。 如果有人有指针,我仍然希望能够反序列化它。 我遵循了几个教程,但是这个 XML 的多个级别似乎让我失望了。
我创建了一个 class 来保存数据,但这就是我在这条道路上取得的成功。
谢谢, 乔
谢谢 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();