0

我的要求是创建 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

2 回答 2

4

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

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

XDocument doc;
using (var stream = ...)
{
    doc = XDocument.Load(stream);
}
// Manipulate doc
using (var stream = ...)
{
    doc.Save(stream);
}
于 2013-05-19T08:36:35.943 回答
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);
于 2013-05-19T08:56:10.240 回答