xdocument保存添加额外的字符

时间:2011-03-17 16:53:17

标签: c# .net xml

我正在使用XDocument加载和保存配置文件。大部分时间它都能正常工作,但有些情况(看似随机)会在最后一个标记之后附加额外信息。这是发生了什么的要点。

预运行配置文件:

<?xml version="1.0" encoding="us-ascii"?>
<local>
</local>

代码:

XDocument config = new XDocument();
config = XDocument.Load(new FileStream(@"c:\foo.xml", FileMode.Open, FileAccess.Read));
XElement fileEle = config.Root.Element("files");
XElement statsEle = new XElement("stats");
statsEle.Add(new XElement("one", "two"));
statsEle.Add(new XElement("three", "four"));
.
.
.
fileEle.Add(statsEle);
config.Save(new FileStream(@"c:\foo.xml", FileMode.Create, FileAccess.Write), SaveOptions.None);

配置文件运行后:

<?xml version="1.0" encoding="us-ascii"?>
<local>
    <files>
        <one>two</one>
        <three>four</three>
    </files>
</local>s>
</local>

有什么建议吗?不知道为什么要添加额外的字符。有时它是额外的标签,有时它是不同的字符,有时它可以正常工作。我尝试使用不同的方法(XMLReader等)加载/保存,以不同的方式添加XML标记。在X运行之后它们都产生相同的错误。谢谢你的帮助!

3 个答案:

答案 0 :(得分:5)

同时为同一个文件打开两个FileStream ...一个用于阅读foo.xml,另一个用于覆盖它。这似乎很成问题。

我建议:

  • 加载FileStream后立即处理阅读XmlDocument
using (FileStream fs = new FileStream(@"C:\foo.xml", FileMode.Open, FileAccess.Read))
{
    config.Load(fs);
}
  • 在您的写FileMode.Truncate中使用FileStream,以便在开始写入文件之前将文件截断为0字节。

答案 1 :(得分:1)

我的猜测是实际更少的标签覆盖(但不截断)文件 - 而你所看到的是更大的XML文件的遗留物。

我从未见过LINQ to XML本身做过这样的事情。

您是否可以运行始终失败的相同测试,但是在每次迭代写入 new 文件而不是覆盖旧文件的模式下?

是否有任何理由直接从FileStreams加载(从未被关闭,正如另一个答案所指出的那样),而不仅仅是使用XDocument.Load(filename)XDocument.Save(filename)

答案 2 :(得分:0)

我之前见过这个......只是想不出怎么解决它。我认为这与你的储蓄方式有关。你需要确保覆盖一切。我不记得是文件模式还是选项......还是其他设置