Linq to XML,选择查询条件

时间:2014-09-17 13:49:14

标签: c# xml linq

这是我的XML内容:

<ListEnginsMesures>
    <EnginsESC>
      <NomValide>Engin_inconnu</NomValide>
      <NomEquivalents>
        <NomEquivalent>Engin inconnu</NomEquivalent>
        <NomEquivalent>Engininconnu</NomEquivalent>
      </NomEquivalents>
    </EnginsESC>
    <EnginsESC>
      <NomValide>DRSC_6150</NomValide>
      <NomEquivalents>
        <NomEquivalent>DRSC 6150</NomEquivalent>
        <NomEquivalent>DRSC6150</NomEquivalent>
        <NomEquivalent>DRSC6.150</NomEquivalent>
        <NomEquivalent>DRSC_6.150</NomEquivalent>
      </NomEquivalents>
    </EnginsESC>
<ListEnginsMesures>

当我有'NomEquivalent'时,我想选择'NomValide'的值。

例如:

(选择'NomValide',其中'NomEquivalent'=“Engin inconnu”)将返回Engin_inconnu。

(选择'NomValide',其中'NomEquivalent'=“DRSC_6.150”)将返回DRSC_6150。

我如何才能实现这一目标?

感谢提前......

1 个答案:

答案 0 :(得分:2)

如果您只期望一个结果,则以下内容应该有效:

string xml=@"<ListEnginsMesures>
    <EnginsESC>
      <NomValide>Engin_inconnu</NomValide>
      <NomEquivalents>
        <NomEquivalent>Engin inconnu</NomEquivalent>
        <NomEquivalent>Engininconnu</NomEquivalent>
      </NomEquivalents>
    </EnginsESC>
    <EnginsESC>
      <NomValide>DRSC_6150</NomValide>
      <NomEquivalents>
        <NomEquivalent>DRSC 6150</NomEquivalent>
        <NomEquivalent>DRSC6150</NomEquivalent>
        <NomEquivalent>DRSC6.150</NomEquivalent>
        <NomEquivalent>DRSC_6.150</NomEquivalent>
      </NomEquivalents>
    </EnginsESC>
</ListEnginsMesures>";

var xe = XElement.Parse(xml);
var result = xe.Elements("EnginsESC")
    .Where
    (
        x=>
        x.Element("NomEquivalents")
            .Elements("NomEquivalent")
            .Any(n=>(string)n=="Engin inconnu")
    )
    .Select(x=>(string)x.Element("NomValide"))
    .FirstOrDefault();

如果您期望得到多个结果:

var results = xe.Elements("EnginsESC")
    .Where
    (
        x=>
        x.Element("NomEquivalents")
            .Elements("NomEquivalent")
            .Any(n=>(string)n=="Engin inconnu")
    )
    .Select(x=>(string)x.Element("NomValide"));