我尝试将任何以“ NP”开头的节点重命名为“ NP” XmlDocument。我只发现了这个相关的问题。基于我写的最受好评的答案:
XmlNodeList npNodeList = PSbank.SelectNodes("//*[starts-with(name(), 'NP')]");
foreach (XmlNode npNode in npNodeList)
{
// create new (renamed) Content node
XmlNode newNode = PSbank.CreateElement("NP");
// [if needed] copy existing Content children
newNode.InnerXml = npNode.InnerXml;
// replace existing Content node with newly renamed Content node
npNode.ParentNode.InsertBefore(newNode, npNode);
npNode.ParentNode.RemoveChild(npNode);
}
Run Code Online (Sandbox Code Playgroud)
但是,对于我来说,这似乎不起作用。当一个NPX节点包含其他NPX节点时,内部节点不会被替换,因为代码会操纵XmlDocument外部节点并将其替换为新创建的包含old的节点innerXml。
示例Xml:
<S>
<NPC>
<NP> A </NP>
<NPA> B </NPA>
</NPC>
<NPD>
C
</NPD>
</S>
Run Code Online (Sandbox Code Playgroud)
对于这种问题,我希望找到一个更一般,更优雅的答案。
我可以使用LINQ to XML来做到这一点,它更加容易和简洁。首先,它通常是一个更好的库,其次:XElement.Name是可变的。
var doc = XDocument.Parse(xml); // or use XDocument.Load
foreach (var element in doc.Descendants())
{
if (element.Name.LocalName.StartsWith("NP"))
{
element.Name = "NP";
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅此小提琴以获得有效的演示。