2016-03-14 3 views
0
<library> 
    <book> 
     <id>1</id> 
     <name>abc</name> 
     <read> 
      <data>yes</data> 
      <num>20</num> 
     </read> 
    </book> 
    <book> 
     <id>20</id> 
     <name>xyz</name> 
     <read> 
      <data>yes</data> 
     </read> 
    </book> 
    <book> 
     <id>30</id> 
     <name>ddd</name> 
    </book> 
</library> 

Из этого я читаю <book> узел со значением элемента <id> = 20, используя ниже кодКак проверить элемент существует в XML

XElement root = XElement.Load("e_test.xml") 
XElement book = root.Elements("book") 
        .Where(x => (int) x.Element("id") == 20) 
        .SingleOrDefault(); 
if (book == null) 
{ 
    // No book with that ID 
} 



if(book.Element("read").Element("num") != null) //check the node exist 
{ 
    int num = (int) book.Element("read").Element("num"); 
} 

Здесь, если условие не работает должным образом. Он передает условие и входит внутрь и дает пустое исключение. Правильно ли это проверить?

Я использую .NET Framework 4.0

+0

Вы сказали, какую версию .NET вы используете, но не какую версию C# вы используете. Это не одно и то же. –

+0

Я только что попробовал свой код с этим xml и не получил исключение с нулевой ссылкой. Кажется, что-то не хватает. – juharr

ответ

2

Вы должны проверить null для каждого из Elements вызовов:

if(book != null && book.Element("read") != null && book.Element("read").Element("num") != null) //check the node exist 

в C# 6 вы можете использовать ?. оператор, чтобы сделать его чувствовать себя лучше:

if(book?.Element("read")?.Element("num") != null) //check the node exist 
+2

Другим подходом было бы использовать «Элементы (« читать »). Элементы (« num »). FirstOrDefault()'. –

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