Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过LINQ遍历xml中的属性_C#_Xml_Linq - Fatal编程技术网

C# 如何通过LINQ遍历xml中的属性

C# 如何通过LINQ遍历xml中的属性,c#,xml,linq,C#,Xml,Linq,请帮助我完成下面提到的场景,该场景包含xml,我希望代码使用C LINQ <?xml version="1.0" encoding="utf-8" ?> <root> <Countries> <Country name="India"> <state id="1"> Tamilnadu</state> <state> Karnataka</state> &l

请帮助我完成下面提到的场景,该场景包含xml,我希望代码使用C LINQ

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <Countries>
    <Country name="India">
      <state id="1"> Tamilnadu</state>
      <state> Karnataka</state>
    </Country>
    <Country name="America">
      <state id="1"> WI</state>
      <state> AW </state>
    </Country>
    <Country name="Africa">
      <state id="1"> Melbourne</state>
      <state> sydney </state>
    </Country>
  </Countries>
</root>
如何通过LINQ获取属性id=1的状态,因为我能够获取属性名=India?如何给出id=1,我是指没有1的数值,如果你使用C,你可以这样做:

 XDocument document = XDocument.Load("filePath");

 var states = (from state in document.Root.Descendants("state")
               where state.Attribute("id") != null && state.Attribute("id").Value == "1" 
               select state).ToList();

您可以执行以下操作:

空检查很重要,因为根据没有空检查的结构判断,您将得到一个NullReferenceException

尝试以下方法

XDocument xml = XDocument.Load(file);

XElement state = xml.Root.Descendants("Country")
    .First(c => c.Attribute("name").Value == "India")
    .Descendants("state")
    .First(s => (int)s.Attribute("id") == 1);
下一次,请先发布您尝试过的内容,以便我们可以帮助您编写代码


我也没有做空检查。如果找不到这些值,它将首先停止。由您自己做安全检查。

我发现现有的答案过于冗长冗长。想象一下,如果要基于多个属性进行选择,会发生什么

同时最紧凑和最具表现力的解决方案是使用System.Xml.XPath命名空间中的XPath扩展

例如,要获取印度id为1的州:

var xdoc = XDocument.Load(file);
foreach (var element in xdoc.XPathSelectElements("//Country[@name='India']/state[@id=1]"))
{
    Console.WriteLine("State " + element.Value + ", id " + (int)element.Attribute("id"));
}
要获取已分配任何id的所有国家/地区的所有州,请执行以下操作:

foreach (var element in xdoc.XPathSelectElements("//state[@id]"))
{
    Console.WriteLine("State " + element.Value + ", id " + (int)element.Attribute("id"));
}
等等


您可以找到XPath规范。

var query=来自element.Root.genderantsState中的s,其中s.Attributeid.Value==1选择s;-面向对象引用未设置为id为的第二个状态的实例=1@rajalakshmi-您需要添加空签入。请参阅我的编辑。
foreach (var element in xdoc.XPathSelectElements("//state[@id]"))
{
    Console.WriteLine("State " + element.Value + ", id " + (int)element.Attribute("id"));
}