Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C/Linq在xml中添加节点和元素_C#_Asp.net_Xml_Linq - Fatal编程技术网

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

C# 使用C/Linq在xml中添加节点和元素,c#,asp.net,xml,linq,C#,Asp.net,Xml,Linq,我有一个这样的xml文件 <?xml version="1.0" encoding="utf-8" ?> <root> <FeaturedProductCategories> <FeaturedProductCategory> <FeaturedProducts> <FeaturedProduct> <ContentSelector datavalue_i

我有一个这样的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类:


几周前,我不得不做一些非常类似的事情;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());

凉的那么你的问题是什么?@coefect:我想修改xml,如图所示。你能建议我怎么做吗?我需要写doc.Root.ElementFeaturedProductCategories.ElementFeaturedProductCategories.ElementFeaturedProducts.ElementFeaturedProducts.Addnew XElementProducts;用于在FeaturedProduct下创建节点?如果有一种简单的方法可以搜索节点FeaturedProduct并向其添加一个子项,那就太好了。不一定,您可以尝试:XmlNode appNode=xml.SelectSingleNode//FeaturedProductCategories/FeaturedProductCategories/FeaturedProduct/FeaturedProduct XmlElement appTag=xml.CreateElementProducts;xmlementnewapp=xml.CreateElementProduct;newApp.SetAttributename,值;appNode.AppendChildappTag;appTag.AppendChildnewApp;我可以通过搜索节点的名称来删除节点吗?使用IntelleSense后,我得到了以下结果:xNode.RemoveChildxNode.SelectSingleNodeContentSelector@dotnebeginner我已经编辑了我的答案,添加了xNode.InnerText=myInnerText;现在我可以使用您的代码在下面添加节点了。但是,如何将节点添加到下添加的节点中。例如,在您的代码中,我想在同一个foreach循环中的下添加一个节点。有可能吗?@dotnebeginner有可能,您可以使用与添加节点完全相同的方法创建另一个新元素并调用newElement.appendChildNewReleement