2011-06-26 22 views
4

現在、.NET Frameworkを使用してXMLファイルにデータを書き込むC#プログラムがあります。前のデータを上書きせずにファイルに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の2番目のパラメータのために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といくつかの他のバリエーションを試してみましたが、それは私のライブラリにあるように見えません – 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; } 
} 
関連する問題