2009-07-28 2 views
8

Я пытаюсь решить мою проблему в Linq для XML, кажется, что это должно быть довольно просто, но даже после просмотра вопросов Linq to XML здесь я не могу это получить.Проверка наличия дочернего элемента XML с Linq в XML

Возьмите что-то вдоль линий следующего XML:

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

Теперь я хочу, чтобы проверить, если пользователь с идентификатором 2 имеет номер телефона.

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

Приветствия, Ола

ответ

13

Вот подход запроса:

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

Там, наверное, лучше и дождевик способ сделать это (я не еще очень знакомы с Linq к XML), но этот фрагмент кода должен работать:

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); 
    } 
} 

это в основном перечисляет на все «пользовательские» узлы в вашем XML, а затем все «contactDetails» узлы внутри пользовательского узла, и затем проверьте, есть ли какой-либо «телефон», подносы под этим.

.Descendants() вызов вернется список узлов XElement, а если нет ни одного типа вы расспрашивал о, .Count() в этом списке (IEnumerable<T>) возвращает 0 - это то, что мой код проверки.

Марк

1

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

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

не работает с данными NULL в базе данных, так как он не создает теги с пустыми данными

для этого вам нужно было бы зацикливаться h дочерние элементы

Смежные вопросы