2013-05-19 49 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

这很简单。谢谢 –