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

Linq到xml,当子节点满足一定条件时

假设您已经将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']]")