使用Linq查询元素的Xml文档

时间:2013-12-24 19:31:11

标签: c# xml linq linq-to-xml

我正在使用XDocument处理XML数据。 我的Xml具有以下结构

<Info>
 <ProductDetails>
    <ProductDetail>
      <ProductId>123</ProductId>
      <ProductName>Test</ProductName>
      <ProductType>1</ProductType>
      <AccountDetails>
        <AccountType>Single</AccountType>
        <AccountDetail>
          <AccountId>8564</AccountId>
        </AccountDetail>
      </AccountDetails>
    </ProductDetail>
  </ProductDetails>
</Info>

我想基于特定元素Id检索XML中的AccountDetails部分,然后将其替换为其他一些XML内容。 我试过像

这样的东西
xdoc.Root.Element("ProductDetails").Element("ProductDetail").Element("ProductId").Value

实现这一目标的最佳方法是什么

2 个答案:

答案 0 :(得分:3)

听起来您想要找到具有给定产品ID的第一个ProductDetail元素。这可以解决这个问题:

public XElement FindProduct(XDocument doc, int id)
{
    return doc.Descendants("ProductId")
              .Where(pid => (int) pid == id)
              .Select(pid => pid.Parent)
              .FirstOrDefault();
}

如果找不到相关产品,则会返回null。请注意,它检测是否存在具有相同ID的多个产品。

答案 1 :(得分:1)

这是第一个答案的扩展版本:

public void UpdateAccountDetails(XDocument doc, int id,XElement newContent)
 {
  var element = doc.Descendants("ProductDetail")
          .Where(p => (int)p.Element("ProductId").Value == id)
          .Select(p => p)
          .FirstOrDefault();
  if (element != null) {
      element.Element("AccountDetails").ReplaceWith(newContent);
      doc.Save(path);

 }

}