Linq到xml,当子节点满足一定条件时
本文关键字:条件 满足 子节点 xml Linq | 更新日期: 2023-09-27 18:10:56
假设我有下一个xml:
<Report>
<File id="1">
<Variables>
<Variable id="1" name="integer"> 1 </Variable>
<Variable id="1" name="string"> x </Variable>
</Variables>
</File>
<File id="2">
<Variables>
<Variable id="2" name="integer"> 1 </Variable>
<Variable id="2" name="string"> x </Variable>
</Variables>
</File>
<File id="3">
<Variables>
<Variable id="3" name="integer"> 1 </Variable>
<Variable id="3" name="string"> y </Variable>
</Variables>
</File>
我怎么能得到所有文件在其中变量字符串是"x"?
注意linq指向xml vb或c#,但首选vb
假设您已经将XML加载到XDocument
实例中,您可以执行以下操作:
var files = from f in xDoc.Root.Elements("File")
where f.Element("Variables")
.Elements("Variable")
.Any(v => (string)v.Attribute == "string" &&
(string)v == "x")
select f;
或使用等效的基于方法的查询:
var files = xDoc.Root.Elements("File")
.Where(f => f.Element("Variables")
.Elements("Variable")
.Any(v => (string)v.Attribute == "string" &&
(string)v == "x"))
给定以下xml:
Dim xml = <Report>
<File id="1">
<Variables>
<Variable id="1" name="integer">1</Variable>
<Variable id="1" name="string">x</Variable>
</Variables>
</File>
<File id="2">
<Variables>
<Variable id="2" name="integer">1</Variable>
<Variable id="2" name="string">x</Variable>
</Variables>
</File>
<File id="3">
<Variables>
<Variable id="3" name="integer">1</Variable>
<Variable id="3" name="string">y</Variable>
</Variables>
</File>
</Report>
你可以使用Linq:
Dim result = xml.<File> _
.Where(Function(file) file.<Variables>.<Variable> _
.Any(Function(variable) variable.@name = "string" AndAlso
variable.Value = "x"))
或者更短一些,用XPath-Expression查询节点:
Dim doc = New XmlDocument() ' Use XmlDocument instead of XElement '
doc.LoadXml(xml.ToString())
Dim result = doc.SelectNodes("/Report/File[Variables/Variable[@name='string' and text()='x']]")