C#XML Linq在多个同名标签上

时间:2015-04-02 19:36:03

标签: c# xml linq

我在XML文件中有一些项目。例如。多个项目,如下同一个文件中的项目。我想搜索FluidTypes与特定字符串匹配的所有项目条目。

<?xml version="1.0" encoding="utf-8"?>
<data>
  <Project ID="P-2014-000037">
    <Name>FDP001_Bakken</Name>
    <Manager>shell</Manager>
    <Area>NAM</Area>
    <Field>Bakken</Field>
    <Type>Time and Material External</Type>
    <Country>USA</Country>
    <Value>3.5</Value>
    <Geomarket>NAM</Geomarket>
    <FormationTypes>Carbonate</FormationTypes>
    <FormationTypes>Coal</FormationTypes>
    <FormationTypes>Fractures</FormationTypes>
    <FormationTypes>Sandstone</FormationTypes>
    <FluidTypes>Gas Cond</FluidTypes>
    <FluidTypes>Heavy Oil</FluidTypes>
    <DriveMechanisms>Compaction</DriveMechanisms>
    <DriveMechanisms>Aquifer</DriveMechanisms>
    <EORProcesses>CO2</EORProcesses>
    <EORProcesses>CSS</EORProcesses>
  </Project>
</data>

我正在使用以下代码搜索Geomarket匹配项:

   IEnumerable<XElement> values1 = from el1 in root.Elements("Project").
        Where(r => regEx1.IsMatch(r.Element("Geomarket").Value))
                                    select el1;

当我对Fluid类型(具有多个元素)使用相同时:

       IEnumerable<XElement> values1 = from el1 in root.Elements("Project").
            Where(r => regEx1.IsMatch(r.Element("FluidTypes").Value))
                                        select el1;

它仅检查与第一个元素匹配的名称Fluid Types而不是所有流体类型元素。因此,只有Gas Cond与此项目相匹配,但重油却没有。

如何在所有流体类型搜索中进行查询?

2 个答案:

答案 0 :(得分:3)

对嵌套搜索使用Where子句:

        var projects = root
            .Elements("Project")
            .Where(el => el.Elements("FluidTypes").Where(el2 => regEx1.IsMatch(el2.Value)).Any());

这将返回名为"Project"的所有元素,其中至少有一个名为"FluidTypes"的嵌套元素,其Value与您的正则表达式匹配。

或者,使用嵌套的Any()

        var projects = root
            .Elements("Project")
            .Where(el => el.Elements("FluidTypes").Any(el2 => regEx1.IsMatch(el2.Value)));

答案 1 :(得分:-2)

尝试

IEnumerable<XElement> values1 = from el1 in root.Elements("Project").Elements("FluidTypes")
    .Where(r => regEx1.IsMatch(r.Value))
    Select el1;