昨晚我提出了一个关于如何解析重复的XML结构的问题。XML有两个重复的级别,第二个级别包含我需要存储在其他地方的元素。
这个问题被标记为重复,并指向一个公认的答案,基本上是"将Linq用于XML"。
虽然我很感激这个答案,但我的问题的底部指出,我试图了解如何使用LINQ to XML,但不知道如何访问二级数据。
关于如何使用LINQ to XML或任何其他方法来获取XML文档中的信息并能够在其中循环,是否有任何易于理解的示例或教程?
我以前用Perl做过这件事,它基本上吸收了XML,并创建了一个可以迭代的大对象。
链接到原始问题:用C Sharp 解析XML
他们说"熟能生巧"。有时候,做一件事多次是最好的学习方法。使用linq方法"ToList()",类似于下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input =
"<Data>" +
"<Report>" +
"<Machine name="hostA">" +
"<MachineInfo location="LA">" +
"<function name="run">Late</function>" +
"<function name="status">Complete</function>" +
"<function name="date">2015-06-14</function>" +
"</MachineInfo>" +
"<RepItem name="1488" direction="NS">" +
"<Desc>None Found</Desc>" +
"<Status Int="A12">Uplink</Status>" +
"</RepItem>" +
"<RepItem name="1489" direction="S">" +
"<Desc>31Ghz Ant at 285ft.</Desc>" +
"<Status Int="D5">Active</Status>" +
"</RepItem>" +
"<RepItem name="1438" direction="W">" +
"<Desc>West N. Oc. Backup</Desc>" +
"<Status Int="A11">Disabled</Status>" +
"</RepItem>" +
"<RepItem name="1141" direction="SE">" +
"<Desc>MDT Co.</Desc>" +
"<Status Int="B7">Active</Status>" +
"</RepItem>" +
"</Machine>" +
"<Machine name="hostB">" +
"<MachineInfo location="E. LA">" +
"<function name="run">Late</function>" +
"<function name="status">Complete</function>" +
"<function name="date">2015-06-14</function>" +
"</MachineInfo>" +
"<RepItem name="1488" direction="NS">" +
"<Desc>None Found</Desc>" +
"<Status Int="A12">Down</Status>" +
"</RepItem>" +
"<RepItem name="1489" direction="S">" +
"<Desc>31Ghz Ant at 285ft.</Desc>" +
"<Status Int="D5">Active</Status>" +
"</RepItem>" +
"<RepItem name="1438" direction="W">" +
"<Desc>West N. Oc. Backup</Desc>" +
"<Status Int="A11">Disabled</Status>" +
"</RepItem>" +
"<RepItem name="1141" direction="SE">" +
"<Desc>MDT Co.</Desc>" +
"<Status Int="B7">Active</Status>" +
"</RepItem>" +
"</Machine>" +
"</Report>" +
"</Data>";
XDocument doc = XDocument.Parse(input);
var results = doc.Descendants("Machine")
.Select(x => new {
name = x.Attribute("name").Value,
info = new {
machineInfo = x.Element("MachineInfo").Attribute("location").Value,
functions = x.Element("MachineInfo").Elements("function").Select(y => y.Value).ToList()
},
repItems = x.Elements("RepItem")
.Select(y => new {
name = y.Attribute("name").Value,
direction = y.Attribute("direction").Value,
description = y.Element("Desc").Value,
status = y.Element("Status").Value,
index = y.Element("Status").Attribute("Int").Value
}).ToList()
})
.ToList();
}
}
}