如何在解析时检查元素是否存在

时间:2016-12-30 17:49:52

标签: c# asp.net xml xml-parsing

我有一个XDocument new_doc,其中包含以下XML

<lab:lab uri="https://bh03.org/api/lb/3" xmlns:udf="http://ge.com/ri/userdefined" xmlns:ri="http://ge.com/ri" xmlns:lab="http://ge.com/ri/lab">
<name>GTech</name>
<udf:field type="String" name="Account ID">gt</udf:field>
</lab:lab>

使用以下代码,我试图获取帐户ID的值

   XNamespace ns = "http://ge.com/ri/userdefined";
   accountID = new_doc.Descendants(ns + "field").FirstOrDefault(field => field.Attribute("name").Value.Equals("Account ID")).Value;

但是如何在获取帐户ID的值之前检查<udf:field type="String" name="Account ID">gt</udf:field>是否存在。因为有时XML可能类似于下面的

  <lab:lab uri="https://bh03.org/api/lb/3" xmlns:udf="http://ge.com/ri/userdefined" xmlns:ri="http://ge.com/ri" xmlns:lab="http://ge.com/ri/lab">
  <name>GTech</name>
  </lab:lab>

1 个答案:

答案 0 :(得分:1)

您可以使用XPath并检查字段是否为空。

var nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("udf", "http://ge.com/ri/userdefined");
var xDoc = XDocument.Load(filename);  

var field = xDoc.XPathSelectElement("//udf:field[@name]", nsmgr);
if(field != null)
{
    var name = field.Attribute("name");
}

PS:事实上//udf:field已经足够了。 //udf:field[@name]还会检查 name 属性是否存在。其受限制的版本可以是//udf:field[@name='Account ID']