LinqToXML Почему это не работает? - PullRequest
1 голос
/ 21 апреля 2011

У меня есть пример файла XML:

 <?xml version="1.0" encoding="utf-8" ?>
 <contacts>
   <contact contactId="2">
     <firstName>Barney</firstName>
     <lastName>Gottshall</lastName>
   </contact>
   <contact contactId="3">
     <firstName>Armando</firstName>
     <lastName>Valdes</lastName>
   </contact>
   <contact contactId="4">
     <firstName>Adam</firstName>
     <lastName>Gauwain</lastName>
   </contact>
 </contacts>

и моя программа:

using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;

public class Program
{
    public class contact
    {
        public int contactId { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }
        public override string ToString()
        {
            return firstName+" "+lastName;
        }
    }

    public static void Main()
    {
        string test;
        XDocument xDocument = XDocument.Load("items.xml");

        var all = from a in xDocument.Elements("contact")
                  where a.Attribute("contactId")!=null 
                  select new contact
                             {
                                 contactId = (int) a.Attribute("contactId"),
                                 firstName = (string) a.Attribute("firstName"),
                                 lastName = (string) a.Attribute("lastName")

                             };

        if (all == null)
            Console.WriteLine("Null !");
        else
            foreach (contact t in all)
            {
                test = t.ToString();
                Console.WriteLine(t.ToString());
            }
        }
        Console.ReadKey();
    }
}

Этот код показывает мне пустое окно консоли. Там нет "Null!" и нет контактного элемента. Я провел много времени, думая, почему это ... кто-то может мне помочь? когда я ставлю точку останова внутри оператора foreach, он не работает

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

На самом деле есть несколько причин.

  1. Elements предоставляет только элементы верхнего уровня документа (элемент «контакты»), поэтому вы должны использовать Descendants для получения элементов нижнего уровня).
  2. firstName и lastName являются элементами, а не атрибутами.

Вот рабочий код:

    var all = from a in xDocument.Descendants("contact")
              where a.Attribute("contactId")!=null 
              select new contact
                         {
                             contactId = (int) a.Attribute("contactId"),
                             firstName = (string) a.Element("firstName").Value,
                             lastName = (string) a.Element("lastName").Value
                         };
2 голосов
/ 21 апреля 2011

Попробуйте Descendants() вместо Elements()

var all = from a in xDocument.Descendants("contact")
                  where a.Attribute("contactId") != null 
                  select new contact
                             {
                                 contactId = (int) a.Attribute("contactId"),
                                 firstName = (string) a.Attribute("firstName"),
                                 lastName = (string) a.Attribute("lastName")

                             };

или Element("contacts").Elements("contact")

var all = from a in xDocument.Element("contacts").Elements("contact")
                  where a.Attribute("contactId") != null 
                  select new contact
                             {
                                 contactId = (int) a.Attribute("contactId"),
                                 firstName = (string) a.Attribute("firstName"),
                                 lastName = (string) a.Attribute("lastName")

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