繁体   English   中英

使用C#/ Linq在xml中添加节点和元素

[英]Add node and elements in xml using C#/Linq

我有一个这样的xml文件,

<?xml version="1.0" encoding="utf-8" ?>
<root>  
  <FeaturedProductCategories>
    <FeaturedProductCategory>
      <FeaturedProducts>
        <FeaturedProduct>
          <ContentSelector datavalue_idtype="content:smartform" datavalue_displayvalue="«Smart Form:49»">49</ContentSelector>
        </FeaturedProduct>
      </FeaturedProducts>
    </FeaturedProductCategory>
  </FeaturedProductCategories>
</root>

我想像下面这样修改它,

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <Title>HomePage</Title>
  <FeaturedProductCategories>
    <FeaturedProductCategory>
      <FeaturedProducts>
        <FeaturedProduct>
          <Products>
            <Product>
              <ProductTitle>Product</ProductTitle>
              <ProductDate>03-08-2012 11:57:25</ProductDate>
              <ProductImage>
                <img src="ex1.jpg" />
              </ProductImage>
              <ProductThumbnailImage>
                <img src="ex2.jpg" />
              </ProductThumbnailImage>
              <ProductCaption>Product Caption</ProductCaption>
              <ProductImage>
                <img src="ex3.jpg" />
              </ProductImage>
              <ProductThumbnailImage>
                <img src="ex4.jpg" />
              </ProductThumbnailImage>
              <ProductCaption>Product Caption</ProductCaption>
            </Product>
          </Products>
        </FeaturedProduct>
      </FeaturedProducts>
    </FeaturedProductCategory>
  </FeaturedProductCategories>
</root>

所有新节点和值都将通过C#函数添加。 现在让我们假设这些新值是静态值。

另外,节点“ FeaturedProduct”不仅是一个。 该名称中有很多节点。 我要修改所有“ FeaturedProduct”节点。

您应该在这里查看XDocument类: http : //msdn.microsoft.com/zh-cn/library/system.xml.linq.xdocument.aspx

几周前,我不得不做一些非常类似的事情。 XDocument更愿意处理数据,并且将LINQ与它一起使用非常容易。

这并没有完全使用linq,但是可以满足您的目的

        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("filename.xml");

        foreach (XmlNode xNode in xDoc.SelectNodes("//FeaturedProduct"))
        {
            XmlElement newElement = xDoc.CreateElement("newElementName");
            XmlAttribute newAttribute = xDoc.CreateAttribute("AttributeName");
            newAttribute.Value = "attributeValue";
            newElement.Attributes.Append(newAttribute);

            xNode.AppendChild(newElement);
            xNode.InnerText = "myInnerText";
        }

另外, 本文档是Xpath的非常方便的参考

使用Linq的方法如下:

        string documentXml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<root>
    <FeaturedProductCategories>
        <FeaturedProductCategory>
            <FeaturedProducts>
                <FeaturedProduct>
                    <ContentSelector datavalue_idtype=""content:smartform"" datavalue_displayvalue=""«Smart Form:49»"">49</ContentSelector>
                </FeaturedProduct>
            </FeaturedProducts>
        </FeaturedProductCategory>
    </FeaturedProductCategories>
</root>";

        string productsXml = @"<Products>
    <Product>
        <ProductTitle>Product</ProductTitle>
        <ProductDate>03-08-2012 11:57:25</ProductDate>
        <ProductImage>
            <img src=""ex1.jpg"" />
        </ProductImage>
        <ProductThumbnailImage>
            <img src=""ex2.jpg"" />
        </ProductThumbnailImage>
        <ProductCaption>Product Caption</ProductCaption>
        <ProductImage>
            <img src=""ex3.jpg"" />
        </ProductImage>
        <ProductThumbnailImage>
            <img src=""ex4.jpg"" />
        </ProductThumbnailImage>
        <ProductCaption>Product Caption</ProductCaption>
    </Product>
</Products>";

        XDocument document = XDocument.Parse(documentXml);

        var targetNodes = from featuredProduct in document.Descendants("FeaturedProduct")
                          from contentSelector in featuredProduct.Elements("ContentSelector")
                          select contentSelector;

        foreach (var targetNode in targetNodes)
        {
            targetNode.ReplaceWith(XElement.Parse(productsXml));
        }

        Console.WriteLine(document.ToString());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM