我是Linq to Xml的新手。我有一个非常简单的xml文件,如下所示:
<Items>
<Item>
<Stuff>Strings</Stuff>
</Item>
<Item>
<Stuff>Strings</Stuff>
</Item>
</Items>
我试图像这样查询:
XDocument doc = XDocument.Load(myStream)
from node in doc.Descendants(XName.Get("Item"))
select new { Stuff = node.Element(XName.Get("Stuff")).Value }
但是doc.Descendents(XName.Get(“Item”))返回null。我的理解在这里出了点问题。
答案 0 :(得分:1)
您的代码确实有效:
static void Main(string[] args)
{
string xml = @"
<Items>
<Item>
<Stuff>Strings</Stuff>
</Item>
<Item>
<Stuff>Strings</Stuff>
</Item>
</Items>";
using (StringReader myStream = new StringReader(xml))
{
XDocument doc = XDocument.Load(myStream);
var query = from node in doc.Descendants(XName.Get("Item"))
select new { Stuff =
node.Element(XName.Get("Stuff")).Value };
foreach (var item in query)
{
Console.WriteLine("Stuff: {0}", item.Stuff);
}
}
应该注意的是,如果元素没有使用命名空间限定,那么你真的不需要XName:
static void Main(string[] args)
{
string xml = @"
<Items>
<Item>
<Stuff>Strings</Stuff>
</Item>
<Item>
<Stuff>Strings</Stuff>
</Item>
</Items>";
using (StringReader myStream = new StringReader(xml))
{
XDocument doc = XDocument.Load(myStream);
var query = from node in doc.Descendants("Item")
select new { Stuff = node.Element("Stuff").Value };
foreach (var item in query)
{
Console.WriteLine("Stuff: {0}", item.Stuff);
}
}
}
答案 1 :(得分:0)
尝试使用doc.Root.Decendants(“Item”)
答案 2 :(得分:0)
从System.String到XName的隐式转换,所以更通常的形式是
...doc.Descendants("Item")
和
...node.Element("Stuff").Value
除此之外,我建议doc.Root.Descendants()与上一个答案一样。加载时,文档仍位于层次结构的“顶部”。我的印象是Descendants()是递归的,但谁知道呢,对吧?