2016-01-13 48 views
1
XmlDocument doc = new XmlDocument(); 

string soapEnvelope = 
@"<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/""> 
<s:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""  xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> 
<ExternalProcessingStatusUpdate xmlns=""http://tempuri.org/""> 
    <deliveryId>12232</deliveryId> 
    <success>true</success> 
    <message>Completed</message> 
    </ExternalProcessingStatusUpdate> 
    </s:Body> 
</s:Envelope>"; 


doc.Load(new StringReader(soapEnvelope)); 

//Create a new node. 
XmlElement elem = doc.CreateElement("orderId"); 
elem.InnerText = "ORDER_994865453"; 

XmlNode root = doc.DocumentElement; 

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("rate", "http://www.w3.org/2001/XMLSchema"); 
var node = doc.SelectSingleNode("//rate:ExternalProcessingStatusUpdate", nsmgr); 

doc.InsertAfter(elem, node.FirstChild); 

我想在上面的Xml字符串中的「deliveryid」元素之後插入一個新元素「orderId」。如何解決此問題?將XmlElement添加到另一個XmlElement下面

回答

0

ExternalProcessingStatusUpdate具有默認名稱空間(xmlns="..."),所以它和它的後綴元素不帶前綴都在該默認名稱空間中。這意味着,新元素orderId應在該命名空間過於聲明,否則將沒有命名空間創建,像<orderId xmlns="">,我以爲不是你真正想要的東西:

//Create a new node in "http://tempuri.org/" namespace 
XmlElement elem = doc.CreateElement("", "orderId", "http://tempuri.org/"); 
elem.InnerText = "ORDER_994865453"; 

那麼你應該打電話InsertAfter()對新節點的父:

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("rate", "http://tempuri.org/"); 
var deliveryId = doc.SelectSingleNode("//rate:ExternalProcessingStatusUpdate/rate:deliveryId", nsmgr); 

deliveryId.ParentNode.InsertAfter(elem, deliveryId); 

dotnetfiddle demo

+0

amazi ng答案像魅力感謝 –

+0

@SagarJagadesh不客氣!並且不要忘記[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)答案 – har07