2008-10-07 41 views
25

我有一個已經存在並從文件中讀取的XmlDocument。將XML字符串塊附加到現有的XmlDocument

我想將一大塊Xml添加到文檔中的節點。有沒有一種很好的方式來創建和添加所有節點,而不會讓許多.CreateNote和.AppendChild調用混淆我的代碼?

我想創建一個有效的Xml節的字符串或stringBuilder的一些方法,並將其附加到一個XmlNode。

例如: 原始xmlDoc中:

<MyXml> 
    <Employee> 
    </Employee> 
</MyXml> 

和,我想標籤添加人口(有幾個孩子)給員工:

<MyXml> 
    <Employee> 
     <Demographic> 
     <Age/> 
     <DOB/> 
     </Demographic> 
    </Employee> 
</MyXml> 

回答

71

我建議使用XmlDocument.CreateDocumentFragment如果你有數據以自由格式字符串。您仍然必須使用AppendChild將片段添加到節點,但是您可以在StringBuilder中自由構建XML。

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(@"<MyXml><Employee></Employee></MyXml>"); 

XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
xfrag.InnerXml = @"<Demographic><Age/><DOB/></Demographic>"; 

xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
+2

簡而言之...非常棒! +1 – tigerswithguitars 2012-07-18 09:45:54

+0

優秀的解決方案 – Nirman 2013-04-26 12:20:24

11

試試這個:

employeeNode.InnerXml = "<Demographic><Age/><DOB/></Demographic>"; 

或者(如果你有,你要使用另一個XML文檔):

employeeNode.AppendChild(employeeNode.OwnerDocument.ImportNode(otherXmlDocument.DocumentElement, true)); 
2

考慮使用的XmlWriter上一個StringBuilder構建片段因爲這將爲您提供驗證和字符替換。

6

作爲替代方案,這是你如何能做到這一點更LINQy 3.5的方式:

XDocument doc = XDocument.Load(@"c:\temp\test.xml"); 
XElement demoNode = new XElement("Demographic"); 
demoNode.Add(new XElement("Age")); 
demoNode.Add(new XElement("DOB")); 
doc.Descendants("Employee").Single().Add(demoNode); 
doc.Save(@"c:\temp\test2.xml"); 
0

所有我要做的就是創建一個新的數據集對象,並打開使用ReadXML的myDataset.ReadXML(path and file name) XML文件。

然後添加或刪除我需要的行並使用myDataset.WriteXML(path and file name)再次保存文檔。

再見。

0

這一切都沒有爲我工作,所以我玩過高招,這裏是我的解決方案。

先加載一個文本字段(你可以在公共版本中將其設置爲visible = false) 像這樣加載數據到文本字段中。

string Path = Directory.GetCurrentDirectory() + "/2016"; 
      string pathFile = Path + "/klanten.xml"; 
      StreamReader sr = new StreamReader(pathFile); 
      txt.Text = sr.ReadToEnd(); 
      sr.Close(); 

在保存按鈕上加載文本字段並保存。 不要忘了你將不得不刷新文本字段,如果你想添加多個地址/名稱,我沒有包括那部分。

string name = Globals.s_Name; 
     string klanten = txt.Text; 
     string s = klanten; 
     XmlDocument xdoc = new XmlDocument(); 

     string klant = "<voornaam>" + naamBox1.Text + "</voornaam>"; 
     xdoc.LoadXml(s); 
     XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
     xfrag.InnerXml = klant; 
     xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
     xdoc.Save(name + "/klanten.xml");