2016-08-25 12 views
1

XmlDocumentの "NP"から "NP"で始まるノードの名前を変更しようとしました。私はthis related questoinしか見つけませんでした。最もアップ投票の回答をもとに私が書いた:Xmlノードの名前を変更

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> 

私はこのような問題のために、より一般的でエレガントな答えを探してください。

+0

ありがとうございました。 – Furtiro

答えて

4

私はこれを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を参照してください。

関連する問題