【问题标题】:How can I use an Xml attribute value to get an associated element?如何使用 Xml 属性值来获取关联元素?
【发布时间】:2015-10-19 14:49:20
【问题描述】:

我有一个包含我的数据的大型 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>

我需要解决一个单独的阴影,知道颜色,例如。 “Red”和 Shade id 例如“3”。

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

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

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

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

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    如果我理解正确,您想知道有多少元素具有给定的 Shade id。

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

    试试这个:

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

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

    干杯

    【讨论】:

    • 计算元素绝对是我的要求之一,但关键要求是,如果我知道颜色(例如“红色”)并且如果我知道 id(例如“3”),我该如何返回名称文本,在本例中为“lava”?
    • 也在@har07 - 你能指出任何有用的网络资源来学习如何使用 Linq to Xml 和 XPath 查询吗?
    • 以上还有@jdweng​​span>
    【解决方案2】:

    试试这个

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

    【讨论】:

    • 谢谢,这正是我需要的。
    【解决方案3】:

    除了使用 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”

    【讨论】:

    • 谢谢你。 S/阴影在转录中丢失了。也感谢你让我开始使用 dotnetfiddle,我的生活现在已经完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多