как искать узел в файле xml, чтобы увидеть, что он существует

Я пытаюсь получить файл xml. Поля всегда одни и те же, но иногда не включаются.

Как мне искать «Имя» в vb?

<product>
  <Name>
    <FirstName> John </FirstName>
    <LastName> Doe </LastName>
  </Name>
  <Age> 24 </Age>
  <DOB> 4/5/1990 </DOB>
</product> 

Я попробовал приведенный ниже код и получил ошибку компиляции BC30456: «Содержит» не является членом System.XML.Linq.XElement

dim doc as XDocument
if doc.Root.Element("product").Contains("Name") Then
   doc.Root.Element("product").Elements("Name").Remove()
end if  

person Sash    schedule 24.04.2014    source источник
comment
См. соответствующий ответ здесь...   -  person Cylian    schedule 24.04.2014


Ответы (1)


Способ проверить, существует ли элемент, — просто получить к нему доступ, а затем проверить, является ли он Nothing, например:

If doc.Element("product").Element("Name") IsNot Nothing Then
    ' ...
End If

Обратите внимание, что я использовал doc.Element("product"), а не doc.Root.Element("product"), поскольку в вашем примере XML product является корневым элементом. Однако такое использование свойства Element опасно, поскольку оно вызовет исключение, если родительский элемент не существует. Другими словами, если doc.Element("product") возвращает Nothing, вы не можете развернуться и получить доступ к Nothing.Element("Name"). Итак, чтобы исправить это, вам нужно сделать что-то вроде этого:

If (doc.Element("product") IsNot Nothing) AndAlso (doc.Element("product").Element("Name") IsNot Nothing) Then
    ' ...
End If

Но это становится уродливым довольно быстро. Более простой способ — использовать синтаксис .<> для доступа к элементам, например:

If doc.<product>.<Name>.FirstOrDefault IsNot Nothing Then
    ' ...
End If

Это вернет Nothing, если product или Name не существует. Он не выдаст исключение, если один или оба из них будут отсутствовать. Если вы хотите, чтобы он выдавал исключение, вы все равно можете использовать синтаксис .<>, но просто вызывать First, а не FirstOrDefault.

Конечно, я мог бы указать, что все это было бы немного проще, чище и гибче, если бы вы использовали XPath (отраслевой стандарт), а не собственную технологию Microsoft LINQ-to-XML, но это было бы просто мелочью. . Хорошо, я думаю, это выскользнуло вопреки моему здравому смыслу, поэтому, поскольку я уже сказал это, я мог бы также привести пример:

If doc.XPathSelectElement("/product/Name") IsNot Nothing Then
    ' ...
End If
person Steven Doggart    schedule 24.04.2014
comment
Спасибо пришлось все поменять на .‹› и заработало! - person Sash; 24.04.2014