Linq XDocument根据2个属性值返回元素列表

时间:2014-01-15 05:30:04

标签: c# xml linq

是否可以根据2个匹配的属性值返回元素列表。我尝试了以下但没有成功。

var query = xdoc.Root.Elements("Root")
.Where(x => x.Attribute("Name").Value == "Value1")
.Where(x => x.Attribute("Name").Value == "Value2")
.Select(x => (string)x.Element("ElementName");

这是示例xml结构

    <Region Name="Leeds">
        <Group>
            <Data1>Some data 1</Data1>
            <Data2>Some data 2</Data2>
        </Group>
<Group>
            <Data1>Some data 1</Data1>
            <Data2>Some data 2</Data2>
        </Group>

    </Region>
    <Region Name="Armley">
        <Group>
            <Data1>Some data 3</Data1>
            <Data2>Some data 4</Data2>
        </Group>
    </Region>

提前致谢

2 个答案:

答案 0 :(得分:3)

您可以在@Adil建议的同一||条款中使用Where,也可以使用Contains

var names = new [] { "Value1", "Value2" };

var query = xdoc.Root.Elements("Root")
                     .Where(x => names.Contains((string)x.Attribute("Name")))
                     .Select(x => (string)x.Element("ElementName");

我还将XAttribute.Value更改为(string)XAttribute以使其更安全。

答案 1 :(得分:1)

您可能需要使用或||来获取属性name具有value1value2的记录。您拥有的语句将过滤掉属性名称为value1的记录,然后它将应用属性名称应具有value2的过滤器,除非value1等于value2,否则这是不可能的。

var query = xdoc.Root.Elements("Root")
.Where(x => x.Attribute("Name").Value == "Value1" || x.Attribute("Name").Value == "Value2")
.Select(x => (string)x.Element("ElementName");