【问题标题】:Add node and elements in xml using C#/Linq使用 C#/Linq 在 xml 中添加节点和元素
【发布时间】:2012-08-08 15:12:34
【问题描述】:

我有一个这样的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”节点。

【问题讨论】:

  • 酷。那么你的问题是什么?
  • @Coeffect:我想修改xml,如图。你能建议我怎么做吗?

标签: c# asp.net xml linq


【解决方案1】:

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

几周前我不得不做一些与此非常相似的事情; XDocument 更愿意操作数据,并且与它一起使用 LINQ 非常容易。

【讨论】:

  • 我需要写 doc.Root.Element("FeaturedProductCategories").Element("FeaturedProductCategory").Element("FeaturedProducts").Element("FeaturedProduct").Add(new XElement( “产品”));在“FeaturedProduct”下创建节点?如果有一种简单的方法可以搜索节点“FeaturedProduct”并向其添加子节点,那就太好了。
  • 不一定,你可以试试:XmlNode appNode = xml.SelectSingleNode("//FeaturedProductCategories/FeaturedProductCategory/FeaturedProducts/FeaturedProduct") XmlElement appTag = xml.CreateElement("Products"); XmlElement newApp = xml.CreateElement("Product"); newApp.SetAttribute("name", "value"); appNode.AppendChild(appTag); appTag.AppendChild(newApp);
【解决方案2】:

这并不完全使用 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";
        }

另外,This Documentation 是一个非常方便的 Xpath 参考

【讨论】:

  • 我可以通过搜索节点名称来删除节点“”吗?
  • 利用智能后,我想出了以下几点:xNode.RemoveChild(xNode.SelectSingleNode("ContentSelector"));
  • @DotNetBeginner 我已经编辑了我的答案,添加了xNode.InnerText = "myInnerText";
  • 现在我可以使用您的代码在 下添加节点。但是,如何将节点添加到 下添加的节点。例如,从您的代码中,我想在同一 foreach 循环中的 下添加一个节点。这可能吗?
  • @DotNetBeginner 是的,这是可能的,您可以使用与将节点添加到 &lt;FeaturedProduct&gt; 完全相同的方式进行操作,只需创建另一个新元素并调用 newElement.AppendChild(newerElemeent)
【解决方案3】:

以下是使用 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多