c# -使用LINQ查询从复杂的XML文档中获取值


<?xml version="10" encoding="utf-8"?>
<FormSet xmlns="www.googlecom">
<FormHeader>
<FormSectionA>
<Order>
<Order02>Valuexxx</Order02>
<OrderSubGroup>
<Order03>Valuexxx</Order03>
<Order03>Valuexxx</Order03>
<Order04>Valuexxx</Order04>
<Order05>Valuexxx</Order05>
</OrderSubGroup>
<OrderSubGroup>
<Order03>Valuexxx</Order03>
<Order03>Valuexxx</Order03>
<Order04>Valuexxx</Order04>
<Order05>Valuexxx</Order05>
</OrderSubGroup>
<OrderSubGroup>
<Order03>Valuexxx</Order03>
<Order03>Valuexxx</Order03>
<Order04>Valuexxx</Order04>
<Order05>Valuexxx</Order05>
</OrderSubGroup>
<Order08>Valuexxx</Order08>
<OrderFinalGroup>
<Order09>Valuexxx</Order09>
<Order10>Valuexxx</Order10>
<Order11>Valuexxx</Order11>
</OrderFinalGroup>   
</Order>
</FormSectionA>
</FormHeader>
</formset>

我一直在尝试从上面的xml做某种形式的LINQ查询。实际的XML比这复杂得多,但我认为,如果我能弄清楚如何在底部捕获Order11的值,我就能弄清楚其余的。我尝试创建一个XML树,为整个XML文档创建类(这变得完全太复杂了,我认为我是过于复杂了)

我得出了以下结论

using System;
using System.Xml.Linq;
using System.Linq;
class test
{
static void Main()
{
XDocument doc = XDocument.Load(@"test.xml");
XNamespace googs = "http://www.google.com";
string Str = (string)
(from x in doc.Descendants(googs + "Order11")
select x).First();
Console.WriteLine(Str);
}
}

但是当我运行它时,它告诉我这里没有序列。我也尝试过不引用命名空间,但我觉得这是一种倒退。

谢谢你,我为常见的问题道歉,所有的替代解决方案都不适合我,我不知道为什么。我所需要的只是能够从这样一个有点复杂的XML文档中获取一个值,我的程序的其余部分就可以了。最终,该值将被传递到一个变量中,以便完成其他工作,但所有这些都已经排序好了。

真正的XML文档有一个使每个子组唯一的属性,但我没有包括它,因为最后的组总是唯一命名的,这就是我所关心的。

XDocument doc = XDocument.Load("test.xml");
XNamespace googs = "www.googlecom";

获取一个值:

string singleOrder = doc.Descendants().First(x => x.Name == googs + "Order11").Value;
Console.WriteLine(singleOrder);

从Order**元素中获取所有值:

List<string> orders = (
from x in doc.Descendants()
where x.Name.LocalName.StartsWith("Order") && !x.HasElements
select x.Value
).ToList();
foreach (var order in orders)
Console.WriteLine(order);

您在代码XNamespace googs = "http://www.google.com"中使用的名称空间不是在XML<FormSet xmlns="wwwgooglecom">中定义的名称空间,因此您没有获得序列返回是有意义的。

最新更新