从关联的属性值中获取xml属性值

本文关键字:属性 获取 xml 关联 | 更新日期: 2023-09-27 18:18:59

在这个问题中我发现了如何使用

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

通过指定属性"id"来获取元素。上面的代码从下面的Xml返回"lava"。

 <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元素有一个名为"group"的额外属性(为了保持简短,我只将它们添加到"Red"中)。我需要做一些类似于之前的事情,只是这一次,而不是搜索'id'并返回其'颜色',我想搜索'id'并返回其'group'值。

一个解决方案是将'group'从属性更改为元素,这使得使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>

从关联的属性值中获取xml属性值

由于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 ?检查它们之间的差异。)最后,我们使用FirstOrDefault方法获取id属性为3的第一个节点。如果没有节点满足条件,它将返回null,这就是我们首先检查它是否返回null的原因,然后才获取group属性,否则它将抛出null引用异常。

try

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