从关联的属性值

时间:2015-10-23 07:26:18

标签: c# xml linq lambda

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元素有一个名为'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>

2 个答案:

答案 0 :(得分:2)

由于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引用异常。

答案 1 :(得分:1)

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