重命名Xml节点

Ahm*_*mad 2 c# xml replace

我尝试将任何以“ 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)

对于这种问题,我希望找到一个更一般,更优雅的答案。

Cha*_*ger 5

我可以使用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)

请参阅此小提琴以获得有效的演示。