【问题标题】:Renaming Xml nodeRenaming Xml node
【发布时间】:2017-01-02 00:13:20
【问题描述】:

我尝试将XmlDocument 中以“NP”开头的任何节点重命名为“NP”。我只找到this related questoin。基于我写的投票最多的答案:

 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例子,谢谢。

标签: c# xml replace


【解决方案1】:

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

请参阅this fiddle 以获得工作演示。

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2014-10-12
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多