我的LINQ出了什么问题?做MSDN所说的,但是

时间:2010-12-06 23:29:44

标签: linq-to-xml

我正在尝试了解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最后一次提供误导性或不正确的信息,但提供的信息看起来正确且合乎逻辑。

3 个答案:

答案 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是孩子,phonecontact的孩子。循环中的xcontact节点,您需要在该节点上访问其子节点。