使用属性值获取XML节点列表

时间:2015-03-18 17:25:27

标签: c# xml

我希望获取列表中具有属性isRequired = true的节点。从下面的xml,我应该在我的节点列表中获得accountno和city。我正在使用XmlDocument。有人可以建议怎么做吗?

<sqltables>

     <account>
      <accountno Type="int" Exec="GetGlobalValue" isRequired="true"/>
      <accountname Type="string" Exec="GetGlobalValue" />
    </account>

    <address>
      <city Type="string" Exec="GetGlobalValue" isRequired="true"/>
      <stateType="string" Exec="GetGlobalValue" />
      <zipcode Type="string" Exec="GetGlobalValue" />
   </address>

1 个答案:

答案 0 :(得分:0)

使用Linq-to-XML要容易得多,但使用XmlDocument可以使用XPath查询定位节点。

XmlDocument doc = new XmlDocument();
doc.Load(xmlData);
XmlNode root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("//account/accountno[@isRequired='true']");

然后,您可以在nodes上进行迭代以访问数据。您只需为帐户城市类型查询编写一个simlar XPath表达式。就个人而言,我不是XPath专家,所以请用上面的表达方式加点盐。这是通过XPath定位元素的MSDN:https://msdn.microsoft.com/en-us/library/d271ytdx(v=vs.110).aspx

这在XDocument(又名Linq-to-XML)

中要容易得多
XDocument doc = XDocument.Load(xmlData);
var nodes = doc.Descendants("accountno").Where(n => n.Attribute("isRequired").Value.equals("true"));

注意:如果您不小心,上述lambda会导致 NullReferenceException

然后您也可以在nodes中迭代,但这次它会返回IEnumerable<XElement>个对象而不是XmlNodeList。这是Linq-to-XML的一个很好的起点:https://msdn.microsoft.com/en-us/library/bb387098.aspx

修改

根据下面的评论,这是一个示例linq查询,它返回“isRequired.equals(”true)“为真的所有内容,无论标签的元素名称如何:

doc.Descendants().Where(n => n.Attribute("isRequired") != null && n.Attribute("isRequired").Value.Equals("true"));