单个xml文件中的两个xml声明错误

时间:2013-05-19 08:32:43

标签: c# .net xml xml-parsing linq-to-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>

哪里出错?

3 个答案:

答案 0 :(得分:4)

您正在使用相同的流加载然后保存。加载后,流将定位在文件的末尾...所以当您之后保存文件时,您将从该位置保存。

我建议您使用using语句加载文档并关闭文件,然后使用另一个using语句来保存文件:

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

答案 1 :(得分:1)

您正在重复使用相同的fileStream ....

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

这将在原始文档之后附加新的(正确更改的)文档。

答案 2 :(得分: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);