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

C# 使用属性值获取XML节点列表,c#,xml,C#,Xml,我想在列表中获取属性为isRequired=true的节点。从下面的xml中,我应该在节点列表中获得accountno和city。我正在使用XmlDocument。有人能建议怎么做吗 <sqltables> <account> <accountno Type="int" Exec="GetGlobalValue" isRequired="true"/> <accountname Type="string" Exec="

我想在列表中获取属性为
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>


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

XmlDocument doc = new XmlDocument();
doc.Load(xmlData);
XmlNode root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("//account/accountno[@isRequired='true']");
然后可以在
节点上迭代访问数据。您只需为account city类型查询编写一个simlar XPath表达式。就我个人而言,我不是XPath专家,所以对上面的表达式持保留态度。以下是有关通过XPath定位元素的MSDN:

这在
XDocument
中要容易得多(又称Linq到XML)

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

然后,您也可以在
节点上进行迭代,不过这次它返回的是
IEnumerable
对象,而不是
XmlNodeList
。以下是Linq到XML的良好起点:

编辑:

根据下面的注释,这里是一个示例linq查询,它返回“isRequired.equals(“true”)为true的所有内容,而不管标记的元素名称如何:

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

请发布您已经尝试过的内容。您是否需要使用
XmlDocument
XDocument
,它使Linq-to-XML更易于使用。我没有使用Linq-to-XML。我使用的是XmlDocument,它将加载XML数据,如下面的XmlDocument ExampleDataXml=new-XmlDocument();ExampleDataXml.LoadXml(XmlData);我需要找出在这个xmldocument中需要为true的XML节点。我知道。但是,您没有发布任何代码,也没有解释为什么在这个简单的用例中使用
xmldocument
而不是
XDocument
。如果要添加代码,请编辑请回答您的问题,并向我们展示您已经尝试过的内容。我还没有编写代码。我是一名初学者。我想知道如何使用Xdocument查找节点。我没有使用Xdocument,因为它是旧的现有应用程序,现在没有修改的空间。您可以建议我如何使用Xdocument进行操作。我将使用Xdocument而不是xmldocumentThank谢谢你的建议。我不想指定Decentant节点。它应该在整个xml中循环并为我找到isRequired值为true的节点。我尝试了以下XDocument XDocument XDocument=XDocument.Load(xmlData);var nodelist=xDoc.subjections()。其中(n=>n.Attribute(“isRequired”).value.Equals(“true”));但它给我的对象引用没有设置为对象错误。哈哈,我警告过你这会发生!那是因为你不能调用
null
上的
Value
属性。你需要在调用变量之前检查null。我会编辑我的答案。我尝试了以下代码var nodelist=xDoc.substands()。其中(n=>n.Attribute(“isRequired“!=null)。选择(a=>a.Attribute(“isRequired”).Value.Equals(“true”);但我在节点中得到的结果为[0]=true。如何获取节点名称?选择用于投影,您不想这样做。请参阅我的编辑。另外,请查看我链接到您的API文档。如果这回答了您的原始问题,请向上投票并标记接受以结束问题。谢谢。
doc.Descendants().Where(n => n.Attribute("isRequired") != null && n.Attribute("isRequired").Value.Equals("true"));