如何在父XElement中返回XElements的子集

时间:2014-08-18 10:43:36

标签: c# xml linq-to-xml

如果我有xml,如下所示:

<ValidationResults>
  <ValidationResult>     
    <Scheme>Scheme A</Scheme>
  </ValidationResult>
  <ValidationResult>  
    <Scheme>Scheme B</Scheme>
  </ValidationResult>   

我想使用Linq to Xml查询它,以便我返回:

<ValidationResults>
  <ValidationResult>     
    <Scheme>Scheme A</Scheme>
  </ValidationResult>     
</ValidationResults>

如果我这样做:

....Element("ValidationResults").Elements("ValidaitonResult")
                                .Where(x => x.Element("Scheme").Value == "Scheme A");

我只返回:

 <ValidationResult>     
    <Scheme>Scheme A</Scheme>
 </ValidationResult>  

然后我正在再次创建父级并将子级添加到它中,这似乎不正确:

var parentElement = new XElement("ValidationResults");
var childElements = //get as above

parentElement.Add(childElements);

如何在其原始父级中返回查询的元素子集?

1 个答案:

答案 0 :(得分:1)

您当前的方法对我来说似乎是最简单的方法,尽管它可以在一个语句中完成:

var element = new XElement("ValidationResults",
    doc.Element("ValidationResults")
       .Elements("ValidationResult")
       .Where(x => x.Element("Scheme").Value == "Scheme A")));

假设您不想修改现有文档, 必须想出一个新的&#34; root&#34;像这样的验证结果元素你需要克隆现有的元素并删除你感兴趣的任何东西。只是复制你想要的元素似乎比修剪你不想要的东西。

当然,您可以非常轻松地避免重复使用字符串文字 - 将其作为常量提取到某处,这样您就可以确保创建一个与旧字符同名的新元素。 / p>