2013-07-29 91 views
1

我試圖替換節點的名稱,但出現以下錯誤「參考節點不是此節點的子節點」。我想我知道爲什麼會發生這種情況,但似乎無法解決這個問題。下面是XML:從XML命名空間插入和刪除節點

<payload:Query1 xmlns="" xmlns:payload="" xmlns:xsi="" xsi:schemaLocation=""> 
     <payload:QueryId>stuff</payload:QueryId> 
     <payload:Data>more stuff</payload:Data> 
</payload:Query1> 

這裏是C#位:

doc.Load(readStream); 
nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("payload", "location"); 
XmlNode Query1 = doc.SelectSingleNode("//payload:Query1", nsmgr); 

public XmlDocument sendReply(args) 
{ 
    XmlNode newNode = doc.CreateElement("payload:EditedQuery"); 
    Query.InsertBefore(newNode, Query1); 
    Query.RemoveChild(Query1); 
    return doc; 
} 

我試圖取代 「查詢」 與 「EditedQuery」,但他不工作。

回答

0

如果你可以使用LINQ .Net 3.5到XML,

XElement root = XElement.Load(readStream); 
XNamespace ns = "http://somewhere.com"; 
XElement Query1 = root.Descendants(ns + "Query1").FirstOrDefault(); 
// should check for null first on Query1... 
Query1.ReplaceWith(new XElement(ns + "EditedQuery")); 

或者,如果你不知道的命名空間,或不想硬編碼:

XElement root = XElement.Load(readStream); 
XElement Query1 = root.Descendants() 
         .FirstOrDefault(x => x.Name.Localname == "Query1"); 
// should check for null first on Query1... 
Query1.ReplaceWith(new XElement(Query1.Name.Namespace + "EditedQuery")); 

Jon Skeet的原因why to use LINQ to XML here over older API's