重命名Xml节点

本文关键字:节点 Xml 重命名 | 更新日期: 2023-09-27 18:04:02

我尝试将XmlDocument中以"NP"开头的任何节点重命名为"NP"。我只找到了这个相关的问题。根据我写的最多投票的答案:

 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);
}

然而,它似乎在我的情况下不起作用。当NPX节点包含其他NPX节点时,内部节点不会被替换,因为代码操作XmlDocument并用包含旧innerXml的新创建节点替换外部节点。

Xml示例:

   <S>
     <NPC>
        <NP> A </NP>
        <NPA> B </NPA>
     </NPC>
     <NPD>
         C
     </NPD>
  </S>

重命名Xml节点

我会用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";
    }
}