2013-05-19 81 views
0

我的需求是創建xml文件並將xml元素添加到現有的xml文件。單個xml文件中的兩個xml聲明錯誤

首先,我嘗試通過以下代碼創建新的xml文件。

using (XmlWriter xmlWriter = XmlWriter.Create(fStream, xmlSettings)) 
{ 
    xmlWriter.WriteStartDocument(true); 
    xmlWriter.WriteStartElement("Friends"); 
    xmlWriter.WriteStartElement("Friend"); 
    xmlWriter.WriteElementString("Name", "Safiq"); 
    xmlWriter.WriteElementString("Like", "Char"); 
    xmlWriter.WriteElementString("Unlike", "anger"); 
    xmlWriter.WriteElementString("Nickname", "good"); 
    xmlWriter.WriteElementString("Gift", "c#"); 
    xmlWriter.WriteEndElement(); 
    xmlWriter.WriteEndElement(); 
    xmlWriter.WriteEndDocument(); 
    xmlWriter.Flush(); 
} 

接下來我嘗試向現有文件添加新元素。

XDocument XDOC = XDocument.Load(fStream); 
XElement x = new XElement("Friend"); 
x.Add(new XElement("Name", "Safiq")); 
x.Add(new XElement("Like", "Char")); 
x.Add(new XElement("Unlike", "anger")); 
x.Add(new XElement("Nickname", "good")); 
x.Add(new XElement("Gift", "c#")); 
XDOC.Descendants("Friends").Single().Add(x); 
XDOC.Save(fStream); 

但我得到以下輸出。

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Friends> 
    <Friend> 
     <Name>Safiq</Name> 
     <Like>Char</Like> 
     <Unlike>anger</Unlike> 
     <Nickname>good</Nickname> 
     <Gift>c#</Gift> 
    </Friend> 
</Friends> 
<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Friends> 
    <Friend> 
     <Name>Safiq</Name> 
     <Like>Char</Like> 
     <Unlike>anger</Unlike> 
     <Nickname>good</Nickname> 
     <Gift>c#</Gift> 
    </Friend> 
    <Friend> 
     <Name>Safiq</Name> 
     <Like>Char</Like> 
     <Unlike>anger</Unlike> 
     <Nickname>good</Nickname> 
     <Gift>c#</Gift> 
    </Friend> 
</Friends> 

哪裏錯了?

回答

4

您正在使用相同的流來加載並保存。加載後,流位於文件的末尾...因此,當您保存文件後,您從該位置保存。

我建議你有一個using語句加載該文件並關閉該文件,然後又using語句來保存文件:

XDocument doc; 
using (var stream = ...) 
{ 
    doc = XDocument.Load(stream); 
} 
// Manipulate doc 
using (var stream = ...) 
{ 
    doc.Save(stream); 
} 
+0

非常感謝。這節省了我的時間。 –

+0

如果我添加stream.position = 0;?我會得到任何未來的錯誤? –

+0

@Shafiq:如果你總是添加數據,則不行。但是,如果您更改代碼以刪除數據,則最終會由於剩餘數據而導致無效的XML文件。我會用一個新的流代替。 –

1

你是一樣的FILESTREAM重新使用......

XDocument XDOC = XDocument.Load(fStream); 
... (nothing with fStream) 
XDOC.Save(fStream); 

這將在原始文件後附加新的(正確更改的)文件。

1

所有你需要做的是位置的流其內容的開始

using (XmlWriter xmlWriter = XmlWriter.Create(fStream, xmlSettings)) 
{ 
    xmlWriter.WriteStartDocument(true); 
    xmlWriter.WriteStartElement("Friends"); 
    xmlWriter.WriteStartElement("Friend"); 
    xmlWriter.WriteElementString("Name", "Safiq"); 
    xmlWriter.WriteElementString("Like", "Char"); 
    xmlWriter.WriteElementString("Unlike", "anger"); 
    xmlWriter.WriteElementString("Nickname", "good"); 
    xmlWriter.WriteElementString("Gift", "c#"); 
    xmlWriter.WriteEndElement(); 
    xmlWriter.WriteEndElement(); 
    xmlWriter.WriteEndDocument(); 
    xmlWriter.Flush(); 
} 

// Reposition The stream 
fStream.Position=0; 

XDocument XDOC = XDocument.Load(fStream); 
XElement x = new XElement("Friend"); 
x.Add(new XElement("Name", "Safiq")); 
x.Add(new XElement("Like", "Char")); 
x.Add(new XElement("Unlike", "anger")); 
x.Add(new XElement("Nickname", "good")); 
x.Add(new XElement("Gift", "c#")); 
XDOC.Descendants("Friends").Single().Add(x); 
XDOC.Save(fStream); 
+0

這很簡單。謝謝 –