2011-08-27 69 views
0

我正在用C#編寫應用程序。我已經有一個非空的.xml文件,我想向它添加新的值,而不刪除現有的值。通過代碼添加xml標記

我曾嘗試這樣的代碼:

第一:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open); 
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null); 
xmlNewUser.WriteStartDocument(); 

xmlNewUser.WriteStartElement("RootEl");//root 

xmlNewUser.WriteStartElement("Zapis"); 

xmlNewUser.WriteStartElement("Name"); 
xmlNewUser.WriteString(txtEnterName.Text); 
xmlNewUser.WriteEndElement(); 

xmlNewUser.WriteEndElement();//end of zapis     

this.Close(); 

二:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open); 
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null); 
xmlNewUser.WriteStartDocument(); 

xmlNewUser.WriteStartElement("RootEl");//root-ot 

xmlNewUser.WriteStartElement("Zapis"); 

xmlNewUser.WriteStartElement("Name"); 
xmlNewUser.WriteString(txtEnterName.Text); 
xmlNewUser.WriteEndElement(); 

xmlNewUser.WriteEndElement();//end of zapis     

xmlNewUser.WriteElementString("Ime", null, txtEnterName.Text); 

this.Close(); 

三:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open); 
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null); 
xmlNewUser.WriteStartDocument(); 

xmlNewUser.WriteStartElement("Zapis"); 

xmlNewUser.WriteStartElement("Name"); 
xmlNewUser.WriteString(txtEnterName.Text); 
xmlNewUser.WriteEndElement(); 

xmlNewUser.WriteEndElement();//end of zapis     

xmlNewUser.WriteElementString("Ime", null, txtEnterName.Text); 

this.Close(); 

我認爲這個問題是該流沒有按不知道在哪裏提出新的價值。 更多信息:根元素已經輸入。

回答

0

使用XmlDocument的:

XmlDocument doc = new XmlDocument(); 
doc.Load("filepath"); 
XmlNode node = doc["MainNode"]["subnode1"]["subnode2"]; //to fetch the node after which you'd like to add something. 
XmlElement stuffToAdd = doc.CreateNode("nodename"); 
stuffToAdd.InnerText = "the value of your added node"; 
node.AddChild(stuffToAdd); 
doc.Save("filepath"); 

我這樣做出來的內存,這樣的方法的名稱是aproximate。

正如另一種答案表示,採用XmlElement可以costy,因爲它是在內存滿載,當你調用Load()加載大的XML文件。

+0

這確實有幫助。非常感謝:) –

1

如果您的.NET版本支持它,請使用LINQ to XML。 (警告:我不是專家,也可能有寫這更優雅的方式。)

// Without error handling 
var root = XElement.Load(@"C:\Users\TrueWill\Downloads\Foo.xml"); 

var product = 
    (from item in root.Elements("item") 
    where item.Element("name").Value == "Product1" 
    select item) 
    .Single(); 

product.Add(new XElement("size", "small")); 

root.Save(@"C:\Users\TrueWill\Downloads\FooCopy.xml"); 

我的測試(前)文件:

<?xml version="1.0" encoding="utf-8"?> 
<test> 
<item><name>Product1</name></item> 
<item><name>Product2</name></item> 
</test> 

我的測試文件副本(後) (我複製而不是替換):

<?xml version="1.0" encoding="utf-8"?> 
<test> 
    <item> 
    <name>Product1</name> 
    <size>small</size> 
    </item> 
    <item> 
    <name>Product2</name> 
    </item> 
</test> 
1

當你寫的XML文件這樣一來,它總是會覆蓋什麼是文件之前。如果您想使用XmlTextWriter寫入它,則必須先複製當前內容,然後將新元素寫入適當的位置。不要忘記,您無法同時讀取和寫入同一個文件,因此您必須使用臨時文件並使用它覆蓋原始文件。或者你首先將整個文件讀入一個字符串。或者先將結果寫入字符串中。

但是更好的解決方案可能是使用XDocument(或XmlDocument)加載整個文檔,修改並保存它。 (這樣做是不是一個好主意,如果XML文件是巨大的。)

0

你有使用XmlTextWriter的原因嗎?我發現LINQ to XML的選擇更容易。

您的代碼將如下所示;

XElement el = new XElement("Zapis"); 
el.Add(new XElement("Name",txtEnterName.Text)) 
el.Save(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml") 
+0

這寫了.xml文件中的新元素,但刪除了其他所有內容。 –

+0

如果你想加載什麼使用var'existingEls = XElement.Load(filename)',然後使用'existingEls.Add()' – kmcc049