在下面的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;
答案 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