2011-06-26 116 views
4

我目前有一個C#程序,它在使用.NET Framework時將數據寫入XML文件。將XML寫入文件而不覆蓋以前的數據

if (textBox1.Text!="" && textBox2.Text != "") 
{ 
    XmlTextWriter Writer = new XmlTextWriter(textXMLFile.Text, null); 
    Writer.WriteStartDocument(); 
    Writer.WriteStartElement("contact"); 
    Writer.WriteStartElement("firstName"); 
    Writer.WriteString(textBox1.Text); 
    Writer.WriteEndElement(); 

    Writer.WriteEndElement(); 
    Writer.WriteEndDocument(); 
    Writer.Close(); 
} 
else 
{ 
    MessageBox.Show("Nope, fill that textfield!"); 
} 

問題是我的XML文件在每次嘗試保存新內容時都被覆蓋。

我對XmlTextWriter中的第二個參數都有nullEncoding.UTF8,但它似乎並沒有改變非覆蓋/覆蓋功能。

+2

所以你實際上想*追加*到一個XML文件。請參閱http://social.msdn.microsoft.com/Forums/da-DK/xmlandnetfx/thread/0f3eaa85-ecc4-424d-b766-3fc8e26f7b12和http://www.tkachenko.com/blog/archives/000053.html – jao

回答

6

你可以使用一個XDocument

public static void Append(string filename, string firstName) 
{ 
    var contact = new XElement("contact", new XElement("firstName", firstName)); 
    var doc = new XDocument(); 

    if (File.Exists(filename)) 
    { 
     doc = XDocument.Load(filename); 
     doc.Element("contacts").Add(contact); 
    } 
    else 
    { 
     doc = new XDocument(new XElement("contacts", contact)); 
    } 
    doc.Save(filename); 
} 

,然後用這樣的:

if (textBox1.Text != "" && textBox2.Text != "") 
{ 
    Append(textXMLFile.Text, textBox1.Text); 
} 
else 
{ 
    MessageBox.Show("Nope, fill that textfield!"); 
} 

這將創建/追加接觸到以下XML結構:

<?xml version="1.0" encoding="utf-8"?> 
<contacts> 
    <contact> 
    <firstName>Foo</firstName> 
    </contact> 
    <contact> 
    <firstName>Bar</firstName> 
    </contact> 
</contacts> 
+0

有沒有讓我在Linq上使用的原因?我試過System.Xml.Linq.XDocument和事件只是System.Linq和一些其他的varations,但它似乎並沒有在我的圖書館 – Johnston

+0

由於某種原因,我不能夠包括LINQ到我的資源,但我真的很喜歡你的方式這個。我結束了 - 不幸的是 - 只是在文件尾部添加一種不自然的方式。謝謝! – Johnston

5

將數據添加到XML文件的唯一方法是讀入數據,添加數據,然後再寫出完整文件。

如果您不想將整個文件讀入內存,您可以使用流接口(例如,XmlReader/XmlWriter)來交織讀取,附加和寫入。

1

手動編寫出來的XML相反的,我會考慮使用XmlSerializer一個通用的名單。它看起來像你的需求很簡單,所以內存使用不是一個問題。要添加一個項目,您將不得不加載列表並重新寫出。

void Main() 
{ 
    var contacts = new List<Contact> 
    { 
     {new Contact { FirstName = "Bob", LastName = "Dole" }}, 
     {new Contact { FirstName = "Bill", LastName = "Clinton" }} 
    }; 

    XmlSerializer serializer = new XmlSerializer(typeof(List<Contact>)); 
    TextWriter textWriter = new StreamWriter(@"contacts.xml"); 
    serializer.Serialize(textWriter, contacts); 
    textWriter.Close(); 
} 

public class Contact 
{ 
    public string FirstName { get; set; } 
    public string MiddleName { get; set; } 
    public string LastName { get; set; } 
} 
相關問題