我正在使用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运行之后它们都产生相同的错误。谢谢你的帮助!
答案 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)
我之前见过这个......只是想不出怎么解决它。我认为这与你的储蓄方式有关。你需要确保覆盖一切。我不记得是文件模式还是选项......还是其他设置