如何使用Xml属性值来获取关联元素?

时间:2015-10-18 20:50:12

标签: c# xml linq

我有一个包含我的数据的大型Xml文件。我需要以编程方式从中获取数据。这是一个小得多的文件,但具有完全相同的结构...

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<colours xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Red>
    <Shade id="1">
      <colour>crimson</colour>
    </Shade>
    <Shade id="2">
      <colour>raspberry</colour>
    </Shade>
    <Shade id="3">
      <colour>lava</colour>
    </Shade>
    <Shade id="4">
      <colour>scarlet</colour>
    </Shade>
  </Red>
  <Green>
    <Shade id="1">
      <colour>asparagus</colour>
    </Shade>
    <Shade id="2">
      <colour>emerald</colour>
    </Shade>
    <Shade id="3">
      <colour>lime</colour>
    </Shade>
    <Shade id="4">
      <colour>avocado</colour>
    </Shade>
  </Green>
  <Blue>
    <Shade id="1">
      <colour>cyan</colour>
    </Shade>
    <Shade id="2">
      <colour>sapphire</colour>
    </Shade>
    <Shade id="3">
      <colour>powder</colour>
    </Shade>
    <Shade id="4">
      <colour>iris</colour>
    </Shade>
  </Blue>
</colours>

我需要解决个别阴影,知道颜色,例如&#34;红色&#34;并且Shade id例如。&#34; 3&#34;。

以下代码计算了阴影元素的数量,这是我需要的东西,但除此之外的任何事情对我来说仍然是一个谜。

    string filepath = "C:/Documents/Data.xml";
    XElement MyData = XElement.Load(filepath);

    int count = MyData.Elements("Red")
                         .Elements("shade")
                         .Count();

    Console.Write(count);
    Console.ReadKey();

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望找到有多少元素具有给定的Shade ID。

您可以对Linq使用XPath查询到XML的XElement。

试试这个:

public void FindShades()
{
    string exePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
    string filepath = exePath + @"\XML\Colours.xml";
    XElement MyData = XElement.Load(filepath);
    IEnumerable<XElement> data = MyData.XPathSelectElements("//Shade[@id='3']");
    int count = data.Count();                                 

}

如果这是您想要的,请告诉我。如果没有,请发表评论,我将修改我的答案。

干杯

答案 1 :(得分:1)

试试这个

            XDocument MyData = XDocument.Load(FILENAME);
            string color = MyData.Descendants("Red").Elements("Shade").Where(y => (int)y.Attribute("id") == 3).FirstOrDefault().Value;​

答案 2 :(得分:1)

除了使用XPath谓词之外,如the other answer所示,您可以使用LINQ Where()方法过滤元素以满足特定条件:

int count = MyData.Elements("Red")
                  .Elements("Shade")
                  .Where(o => (int?)o.Attribute("id") == 3)
                  .Count();

<强> Dotnetfiddle Demo

请注意,XML区分大小写,因此“Shade”不等于“shade”