2013-07-09 2 views
1

Мне дан XML, который содержит необязательные элементы, которые иногда существуют, а иногда и не являются (..). Теперь эти необязательные элементы сами по себе могут также содержать дополнительные элементы:Linq to XML: предотвратить NullReferenceExpception

<show> 
    ... 
    <text> 
     <description> desc </description> 
    </text> 
    ... 
</show> 
<show> 
    <title>I'm a show without text</title> 
</show> 
<show> 
    <text> 
     <subtitle>I have a text-node but no description-node in it.</subtitle> 
    </text> 
</show> 

мне нужно получить, если существующие, значение -node. Что бы лучший способ справиться с этим, как я делаю прямо сейчас:

description = show.Element("text") != null ? show.Element("text").Element("description") != null? show.Element("text").Element("description").Value : "" : "" 

Это чувствует неоптимальным .. Мне нужно запросить гораздо больше узлов.

ответ

2

Я бы с XPath extensions для Linq в Xml:

var description = (string)xdoc.XPathSelectElement("//show/text/description"); 

И использовать литье в строку, чтобы избежать NullReference исключения при доступе Value свойства элемента.

+1

Спасибо, я не знал о XPath, отлично работает! – peter

0

Попробуйте использовать (string)XElement преобразование вместо XElement.Value собственности:

description = (string)show.Element("text").Element("description"); 

Она будет обрабатывать null с.