2009-07-28 21 views
8

Próbuję zrozumieć problem występujący w Linq do XML, wydaje się, że powinien on być całkiem prosty, ale nawet po przejrzeniu pytań Linq do XML tutaj, nie mogę tego dostać.Sprawdzanie, czy element podrzędny XML istnieje z Linq do XML

wziąć coś na wzór poniższego XML:

<users> 
    <user id="1"> 
     <contactDetails> 
      <phone number="555 555 555" /> 
     </contactDetails> 
    </user> 
    <user id="2"> 
     <contactDetails /> 
    </user> 
</users> 

teraz chcę sprawdzić, czy użytkownik o identyfikatorze 2 posiada numer telefonu.

mógłby ktoś zaproponować rozwiązanie, jak powiedziałem wydaje się, że powinna być prosta ...

Wiwaty, Ola

Odpowiedz

13

Oto podejście zapytania:

XElement yourDoc = XElement.Load("your file name.xml"); 

bool hasPhone = (
    from user in yourDoc.Descendants("user") 
    where (int)user.Attribute("id") == 2 
    select user.Descendants("phone").Any() 
    ).Single(); 
3

Nie ma chyba lepszego i płaszcz sposób to zrobić (nie jestem jeszcze strasznie zaznajomieni z LINQ-to-XML), ale ten fragment kodu powinien działać:

XElement yourDoc = XElement.Load("your file name.xml"); 

foreach (XElement user in yourDoc.Descendants("user")) 
{ 
    foreach(XElement contact in user.Descendants("contactDetails")) 
    { 
     var phone = contact.Descendants("phone"); 

     bool hasPhone = (phone.Count() > 0); 
    } 
} 

zasadniczo wymienia się wszystkie „użytkownik” węzły w XML, a następnie wszystkie „contactDetails” węzły wewnątrz węzła użytkownika, a następnie sprawdź, czy jest jakiś "telefon" podwęzły pod tym.

.Descendants() rozmowa powróci listę węzłów Xelement, a jeśli nie ma żadnego typu pan zapytał o, na .Count() na tej liście (an IEnumerable<T>) zwróci 0 - to mój kod sprawdza.

Marc

1

w Linq do XML można zrobić szybki test przed wejściem wartość:

if (!xe.Root.Element("Date").IsEmpty) 
{ 
    pd.datefield = System.Convert.ToString(xe.Root.Element("Date").Value); 
} 

nie działa z danymi NULL w bazie danych, ponieważ nie tworzy ona znaczników z pustymi danymi, ponieważ musiałaby zostać zainicjowana pętla h elementy potomne