我正在尝试接收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
答案 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
如果Nothing
或product
不存在,则会返回Name
。如果其中一个或两个都丢失,它不会抛出异常。如果您确实希望它抛出异常,您仍然可以使用.<>
语法,但只需拨打First
而不是FirstOrDefault
。
当然,我可以指出,如果您使用XPath(行业标准)而不是Microsoft专有的LINQ-to-XML技术,所有这些都会更容易,更清晰,更灵活,但那样做只是小气。好吧,好吧,我猜它反对我更好的判断,所以,只要我已经说过,我不妨举个例子:
If doc.XPathSelectElement("/product/Name") IsNot Nothing Then
' ...
End If