我正在尝试了解LINQ,并从MSDN页面开始:
http://msdn.microsoft.com/library/bb308960.aspx#xlinqoverview_topic2f
这里,它引用了一些示例XML
<contacts>
<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
<address>
<street1>123 Main St</street1>
<city>Mercer Island</city>
<state>WA</state>
<postal>68042</postal>
</address>
<netWorth>10</netWorth>
</contact>
<contact>...
并说以下将列出“电话”元素列表:
XElement contacts = XElement.Load(@"C:\Projects\ALL_MY_PROJECTS\LINQ_Noodling\UI\Contacts.xml");
foreach (x in contact.Elements("phone")) {
Console.WriteLine(x);
}
像这样:
<phone>206-555-0144</phone>
<phone>425-555-0145</phone>
除非没有。我什么都没得到。如果我用“联系人”替换上面的“电话”,我会收到所有联系人(包括“姓名”“电话”“地址”和所有子元素),但就是这样。这不是MSDN最后一次提供误导性或不正确的信息,但提供的信息看起来正确且合乎逻辑。
答案 0 :(得分:4)
<phone>
是<contact>
的子元素,不是根元素。如果查看MSDN示例,请注意它们在一个特定的联系人元素上调用Elements。
您可以链接元素调用*以获取更多子代:
foreach(XElement x in contacts.Elements("contact").Elements("phone"))
*如果我们是挑剔的,它并没有真正链接相同的功能,但IEnumerable<XObject>::Elements()
几乎就像我们期望的那样。
答案 1 :(得分:2)
我认为在声称别人写的东西是错的之前你应该多加注意。
他们做的部分
foreach (x in contact.Elements("phone")) {
Console.WriteLine(x);
}
之前是:
For example, you might have the following XML loaded into an XElement called contact:
<contact>
Met in 2005.
<name>Patrick Hines</name>
<phone>206-555-0144</phone>
<phone>425-555-0145</phone>
<!--Avoid whenever possible-->
</contact>
您的XML文件与此不符。 Elements
只能找到元素的直接子元素。因此,使用您提供的XML文件,访问电话号码(文件中的每个人)的正确方法将是
XElement contacts = XElement.Load(@"C:\Projects\ALL_MY_PROJECTS\LINQ_Noodling\UI\Contacts.xml");
foreach (x in contacts.Elements("contact").Elements("phone")) {
Console.WriteLine(x);
}
答案 2 :(得分:1)
您正在尝试访问contacts
个孩子的孩子。你必须这样做:
XElement contacts = XElement.Load(@"C:\Projects\ALL_MY_PROJECTS\LINQ_Noodling\UI\Contacts.xml");
foreach (x in contact.Elements("contact")) {
Console.WriteLine(x.Element("phone"));
}
contacts
是xml的根,contact
是孩子,phone
是contact
的孩子。循环中的x
是contact
节点,您需要在该节点上访问其子节点。