如何使用linq从同一级别的xml标签中选择属性?

时间:2016-03-19 01:30:01

标签: c# xml linq

在下面的xml中我试图选择FieldName UserName,并从不同属性中的同一级别获取“Value”

我不确定我在linq查询中做错了什么

<?xml version="1.0"?>
<Objects>
  <Object>
    <Property Name="Value" Type="System.String">DeathStar</Property>
    <Property Name="FieldName" Type="System.String">Server</Property>
   </Object>
  <Object>
    <Property Name="Value" Type="System.String">Luke</Property>
    <Property Name="FieldName" Type="System.String">Username</Property>      
  </Object> 
 </Objects>

        var usernameValue =
            from v in
                from e in xd.Descendants().Elements()
                let p = e.Parent
                where
                    e.HasAttributes
                    && e.Name.LocalName.Equals("Property")
                    && e.Attribute("Name").Value.Equals("FieldName")
                    && e.Value.Equals("UserName")
                select p
            where
               v.HasAttributes
               && v.Name.LocalName.Equals("Property")
               && v.Attribute("Name").Value.Equals("Value")
            select v.Value;

2 个答案:

答案 0 :(得分:0)

我建议将查询基于Object元素,您可以从中检查FieldName并返回相应的Value

var usernameValue =
        from o in xd.Descendants("Object")
        where 
            o.Elements("Property")
             .Where(p => (string)p.Attribute("Name") == "FieldName" && (string)p == "Username")
             .Any()
        select 
            o.Elements("Property")
             .Where(p => (string)p.Attribute("Name") == "Value")
             .Select(p => (string)p)
             .FirstOrDefault();

另请注意,XML区分大小写,因此Username与XML中的UserName不匹配,就像在LINQ中一样。

答案 1 :(得分:0)

这将有效,你必须两次过滤集合,首先是对象级别,然后是属性值。

--launcher.XXMaxPermSize
256m

现在可以使用。

访问值
var resultnode = doc.Descendants("Object")
    .Where(d=> d.Descendants("Property").Any(c=>c.Attribute("Name").Value == "FieldName") && d.Descendants("Property").Any(c=>c.Value == "Username"))
    .Descendants("Property")
    .Where(p=>p.Attribute("Name").Value == "Value")
    .FirstOrDefault();      

工作Code