重命名 Xml 节点

5

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

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

示例 Xml:

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

我希望能够为这个问题提供一个更加通用和优雅的解决方案。


请提供一些 XML 的例子,谢谢。 - Furtiro
1个回答

12

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

请参考此Fiddle获取演示效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接