Что не так с моим LINQ здесь?Делать то, что говорит MSDN, но - PullRequest
0 голосов
/ 07 декабря 2010

Я пытаюсь понять 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 ]

4 голосов
/ 07 декабря 2010

<phone> является дочерним элементом <contact>, не корневого элемента.Если вы посмотрите на примеры MSDN, обратите внимание, что они вызывают Elements на одном конкретном элементе контакта.

Вы можете связать вызовы Elements *, чтобы получить дополнительные дочерние элементы:

foreach(XElement x in contacts.Elements("contact").Elements("phone"))

* если бы мы были придирчивы, это на самом деле не та же самая цепочка функций, но IEnumerable<XObject>::Elements() в значительной степени действует так, как мы ожидаем.

2 голосов
/ 07 декабря 2010

Я думаю, вам следует уделить больше внимания, прежде чем утверждать, что что-то написанное другим человеком неверно.

Часть, в которой они делают

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 только находит direct потомков элемента. Таким образом, используя предоставленный вами 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);
}
1 голос
/ 07 декабря 2010

Вы пытаетесь получить доступ к ребенку ребенка 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, к которому вам нужно получить доступ к его дочерним элементам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...