C# 使用C/Linq在xml中添加节点和元素
我有一个这样的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 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