从关联的属性值中获取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>
由于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");