在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>
答案 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");