如何在xml文件中搜索节点以查看它是否存在

时间:2014-04-24 12:05:12

标签: asp.net xml vb.net linq-to-xml xmlnode

我正在尝试接收xml文件。字段总是相同的,但有时不包括在内。

我如何在vb中搜索“姓名”?

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

我尝试了下面的代码并得到了编译错误   BC30456:'Contains'不是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  

1 个答案:

答案 0 :(得分: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

如果Nothingproduct不存在,则会返回Name。如果其中一个或两个都丢失,它不会抛出异常。如果您确实希望它抛出异常,您仍然可以使用.<>语法,但只需拨打First而不是FirstOrDefault

当然,我可以指出,如果您使用XPath(行业标准)而不是Microsoft专有的LINQ-to-XML技术,所有这些都会更容易,更清晰,更灵活,但那样做只是小气。好吧,好吧,我猜它反对我更好的判断,所以,只要我已经说过,我不妨举个例子:

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