【问题标题】:Get xml attribute value from an associated attribute value从关联的属性值中获取 xml 属性值
【发布时间】:2015-10-23 07:26:18
【问题描述】:

this问题中我发现了如何使用

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

通过指定属性“id”来获取元素。上面从下面的 Xml 返回“熔岩”。

 <colours>
<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>

在下面的示例中,我的 Shade 元素有一个名为“组”的额外属性(为了保持简短,我只是将它们添加到“红色”中。我需要做一些与上一个类似的事情,只是这次我不想搜索“id”并返回其“颜色”,而是搜索“id”并返回其“组”值。

一种解决方案是将“组”从属性更改为元素,这使得将 Linq 适应上面的 Xml 更加简单,但我很想看看现有 Xml 的解决方案会是什么样子。

我也渴望了解更多有关 Linq to Xml 和使用此类 Lambda 表达式的信息。您可以指出我的任何好的学习资源都将非常感激。

 <colours>
<Red>
<Shade id="1" group="yes">
 <colour>crimson</colour>
 </Shade>
<Shade id="2" group="no">
 <colour>raspberry</colour>
 </Shade>
<Shade id="3" group="yes">
 <colour>lava</colour>
 </Shade>
<Shade id="4" group="no">
 <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>

【问题讨论】:

    标签: c# xml linq lambda


    【解决方案1】:

    由于group是一个属性,你可以像这样使用.Attribute方法:-

    var colors = MyData.Root.Element("Red")
                            .Elements("Shade")
                            .FirstOrDefault(y => (int)y.Attribute("id") == 3);
    string group;
    if (colors != null)
            group = (string)colors.Attribute("group");
    

    说明:

    我们需要从根节点开始,所以MyData.Root 将给出根节点colours,然后我们需要选择Red 元素,因为我们没有多个Red 节点,所以它不会感觉在这里使用Descendants。现在在Red 节点中,我们可以使用Elements 方法来获取所有Shade 节点。 (为什么我们在这里不使用Descendants?检查difference between them。)最后我们使用FirstOrDefault 方法来获取具有id 属性的第一个节点为3。如果没有节点满足条件,它将返回null,这就是我们首先检查它是否返回null然后获取group属性的原因,否则它将抛出Null引用异常。

    【讨论】:

      【解决方案2】:

      试试

      string color = MyData.Descendants("Red").Elements("Shade").Where(y => (int)y.Attribute("id") == 3).FirstOrDefault().Attribute("group");
      

      【讨论】:

      • 使用 var color = ... 等然后引用 color.Value 工作!太好了,谢谢。
      • @PaulRathbone - 如果答案对您有所帮助,您应该通过投票 \ 接受答案来表示感谢。这就是这个社区的运作方式。检查这个 - meta.stackexchange.com/questions/5234/…
      • 感谢 Rahul 的提醒。直到此刻,我的经验值还不到 15,所以我无法投票。
      猜你喜欢
      • 2016-11-05
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2011-07-26
      • 2020-06-16
      • 2020-08-18
      • 2016-03-04
      相关资源
      最近更新 更多