Linq to XML,选择给定节点的所有属性及其值

Chr*_*sCa 2 linq linq-to-xml

我有一个看起来像这样的xml映射文件

<colourMappings>
    <model name="modelX">
        <mapping colour="White" configCode="1"></mapping>
        <mapping colour="Aluminium" configCode="2"></mapping>
        <mapping colour="Black" configCode="3"></mapping>
        <mapping colour="Blue" configCode="4"></mapping>
        <mapping colour="White Pearl" configCode="5"></mapping>
        <mapping colour="Graphite" configCode="6"></mapping>
        <mapping colour="Gunmetal" configCode="7"></mapping>
        <mapping colour="Indigo" configCode="8"></mapping>
        <mapping colour="Red" configCode="9"></mapping>
    </model>
    <model name="modelY">
        <mapping colour="White" configCode="1" stConfigCode= "xx" dgConfigCode="hj"></mapping>
        <mapping colour="Aluminium" configCode="2" stConfigCode= "xy" dgConfigCode="gh"></mapping>
        <mapping colour="Black" configCode="3" stConfigCode= "xt" dgConfigCode="fg"></mapping>
        <mapping colour="Blue" configCode="4" stConfigCode= "sd" dgConfigCode="fg"></mapping>
        <mapping colour="White Pearl" configCode="5" stConfigCode= "df" dgConfigCode="df"></mapping>
        <mapping colour="Graphite" configCode="6" stConfigCode= "xc" dgConfigCode="df"></mapping>
        <mapping colour="Gunmetal" configCode="7"  stConfigCode= "cv" dgConfigCode="cv"></mapping>
        <mapping colour="Indigo" configCode="8"  stConfigCode= "zx" dgConfigCode="vb"></mapping>
        <mapping colour="Red" configCode="9"  stConfigCode= "fg" dgConfigCode="cv"></mapping>
    </model>
</colourMappings>
Run Code Online (Sandbox Code Playgroud)

我希望能够在给定模型名称和颜色的情况下提取所有属性及其值

例如

给定ModelY和White,我想得到configCode ="1"stConfigCode ="xx"dgConfigCode ="hj"这可以是任何结构 - 数组,列表,等等

我一直在使用Linq到XML但无法获得正确的语法

XDocument mappings = XDocument.Load(@"D:\colour_mappings.xml");
var q = from c in mappings.Descendants("model")
                    where (string)c.Attribute("name") == "modelY" && (string)c.Descendants("mapping").Attributes("colour").FirstOrDefault() == "White"
                    select c.Attributes();
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做吗?

很高兴使用任何方法,不一定需要Linq

Mar*_*sen 6

更新

总结一种方法:

public IEnumerable<XAttribute> GetAttributes(string modelName, string colour)
{
    XDocument mappings = XDocument.Load(@"D:\colour_mappings.xml");

    var q1 =
        from elm in mappings.Descendants("model")
        where (string)elm.Attribute("name") == "modelY"
        select elm;

    var q2 =
        from elm in q1.Descendants("mapping")
        where (string)elm.Attribute("colour") == "White"
        select elm.Attributes().Where(a => a.Name != "colour");


    foreach (IEnumerable<XAttribute> attributeList in q2)
    {
        foreach (XAttribute attribute in attributeList)
        {
            yield return attribute;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)