2015-04-02 59 views
0

我在XML文件中有一些项目。例如。多个项目,如同一个文件中的下面的项目。我想搜索FluidTypes与特定字符串匹配的所有项目条目。在同一个名称的多个标签上的C#XML Linq

<?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> 

我使用的follwing代码来搜索Geomarket的相符:

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

当我使用相同于流体类型(其具有多个元素):

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

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

如何在所有Fluid类型的搜索中进行查询?

+0

为什么你不适合这样的:IEnumerable的值1 = root.Elements( “项目”)的元素( “FluidTypes”); – 2015-04-02 19:43:56

+0

'我想搜索FluidTypes与特定字符串匹配的所有项目条目?例如? – EZI 2015-04-02 19:47:15

+0

例如:搜索流体类型=“重油”的所有项目 'Regex regEx1 = new Regex(“Heavy Oil”,RegexOptions.IgnoreCase);' – 2015-04-02 19:49:27

回答

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))); 
+0

几乎与我的问题一致,我会与这个答案一起去哈哈。 – Aizen 2015-04-02 21:36:57

+0

工作就像一个魅力。非常感谢 !!! – 2015-04-02 22:29:31

-2

尝试

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

谢谢。这对我的情况没有帮助,因为如果我做root.Elements(“Project”)。Elements(“FluidTypes”);那么只有流体类型列注册在我的IEnumerable 值1中。我需要整个元组,即我IEnumerable 值1中的所有列。 'IEnumerable的值1 =从root.Elements EL1( “项目”) 。凡(R => regEx1.IsMatch(r.Value)) 选择EL1;' 我想这和它似乎工作在这种情况下。然而,它会在所有元素中寻找匹配,而不仅仅是流体类型。 – 2015-04-02 22:10:06

相关问题