使用C#更改XML文件中的节点名称

我有一大堆XML文件,具有以下结构:

 someContent someType   someContent someType   someContent someType  ... ... 

我需要将每个“内容”节点名称更改为StuffxContent; 基本上将父节点名称添加到内容节点的名称。

我打算使用XMLDocument类并找出一种方法,但我想我会问是否有更好的方法来做到这一点。

您提供的XML表明某人完全错过了XML的观点。

而不是拥有

    

你应该有:/

    

现在,您将能够使用Xpath遍历文档(即,// stuff [id =’1′] / content /)节点的名称不应用于建立标识,您可以使用属性。

要做你所要求的,将XML加载到xml文档中,然后简单地遍历第一级子节点重命名它们。

伪代码:

 foreach (XmlNode n in YourDoc.ChildNodes) { n.ChildNode[0].Name = n.Name + n.ChildNode[0].Name; } YourDoc.Save(); 

但是,我强烈建议您实际修复XML以使其有用,而不是进一步破坏它。

(1.)[XmlElement / XmlNode] .Name属性是只读的。

(2.)问题中使用的XML结构是粗略的,可以改进。

(3.)无论如何,这是给定问题的代码解决方案:

 String sampleXml = ""+ ""+ "someContent"+ "someType"+ ""+ ""+ "someContent"+ "someType"+ ""+ ""+ "someContent"+ "someType"+ ""+ ""; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(sampleXml); XmlNodeList stuffNodeList = xmlDoc.SelectNodes("//*[starts-with(name(), 'Stuff')]"); foreach (XmlNode stuffNode in stuffNodeList) { // get existing 'Content' node XmlNode contentNode = stuffNode.SelectSingleNode("Content"); // create new (renamed) Content node XmlNode newNode = xmlDoc.CreateElement(contentNode.Name + stuffNode.Name); // [if needed] copy existing Content children //newNode.InnerXml = stuffNode.InnerXml; // replace existing Content node with newly renamed Content node stuffNode.InsertBefore(newNode, contentNode); stuffNode.RemoveChild(contentNode); } //xmlDoc.Save 

PS:我来这里寻找一种更好的重命名节点/元素的方法; 我还在寻找。

这是我为RenameNode()方法找到的一些代码:

http://www.goodgord.com/2006/10/how-to-rename-xml-node-in-c.html

我发现重命名节点的最简单方法是:

 xmlNode.InnerXmL = newNode.InnerXml.Replace("OldName>", "NewName>") 

不要包含开头<以确保重命名结束标记。

也许更好的解决方案是遍历每个节点,并将信息写入新文档。 显然,这将取决于您将来如何使用数据,但我建议使用与FlySwat建议相同的重新格式化…

    

我还建议使用最近添加的XDocument是创建新文档的最佳方式。

我会回答更高的问题:你为什么要使用XmlDocument尝试这个?

我认为实现目标的最佳方法是使用简单的XSLT文件
匹配“CONTENTSTUFF”节点并输出“CONTENT”节点…

没有理由得到这么重的枪……

无论哪种方式,如果你还想做C#Style,
使用XmlReader + XmlWriter而不是XmlDocument用于内存和速度目的。 XmlDocument将整个XML存储在内存中,并使其在Traversing中非常繁重…

如果您多次访问该元素,则XmlDocument很好(不是这里的情况)。

将它作为一个字符串加载并在整个批次上进行替换..

  String sampleXml = ""+ ""+ "someContent"+ "someType"+ ""+ ""+ "someContent"+ "someType"+ ""+ ""+ "someContent"+ "someType"+ ""+ ""; sampleXml = sampleXml.Replace("Content","StuffxContent")