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

时间:2013-08-28 15:20:00

标签: 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>
    </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>

如何获取属性id = 1到LINQ的状态,因为我能够获取属性名称=“印度”?如何给id = 1我的意思是没有“1”的数值

4 个答案:

答案 0 :(得分:2)

如果您使用的是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();

答案 1 :(得分:2)

您可以执行以下操作:

空检查非常重要,因为根据您的结构判断,如果没有空检查,您将获得NullReferenceException

XDocument xml = XDocument.Load("yourFileLocation");

var items = document.Root.Descendants("state")
    .Where(s => s.Attribute("id") != null && s.Attribute("id").Value == "1")
    .ToList();

答案 2 :(得分:2)

请尝试以下操作。

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);

下次发布您先试过的内容,以便我们为您提供代码帮助。

我也没有空检查。如果找不到值,它将在First()上消亡。由你来做自己的安全检查。

答案 3 :(得分:0)

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

最紧凑和最具表现力的解决方案是使用XPath扩展(来自System.Xml.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规范here