C# xdocument保存添加额外字符
我正在使用XDocument加载和保存配置文件。大多数情况下,它都能正常工作,但在某些情况下(似乎是随机的),它会在最后一个标记后附加额外的信息。下面是发生的事情的要点 配置文件预运行:C# xdocument保存添加额外字符,c#,.net,xml,C#,.net,Xml,我正在使用XDocument加载和保存配置文件。大多数情况下,它都能正常工作,但在某些情况下(似乎是随机的),它会在最后一个标记后附加额外的信息。下面是发生的事情的要点 配置文件预运行: <?xml version="1.0" encoding="us-ascii"?> <local> </local> 运行后配置文件: <?xml version="1.0" encoding="us-ascii"?> <local> <
<?xml version="1.0" encoding="us-ascii"?>
<local>
</local>
运行后配置文件:
<?xml version="1.0" encoding="us-ascii"?>
<local>
<files>
<one>two</one>
<three>four</three>
</files>
</local>s>
</local>
二
四
s>
有什么建议吗?不知道为什么要添加额外的字符。有时是额外的标签,有时是不同的字符,有时工作正常。我尝试过使用不同的方法(XMLReader等)加载/保存,并以不同的方式添加XML标记。。在X运行之后,它们都会产生相同的错误。谢谢你的帮助 我的猜测是,实际上有什么东西用更少的标记覆盖(但不是截断)了文件,而您看到的是一个更大的XML文件的剩余部分 我从未见过linqtoxml本身做过这样的事情 您是否可以运行总是失败的相同测试,但每次迭代都会写入一个新文件,而不是覆盖旧文件
有没有什么原因可以让你直接从
文件流
(正如另一个答案所指出的,这些文件流从来没有被关闭过)加载,而不是仅仅使用XDocument.Load(filename)
,XDocument.Save(filename)
?我的猜测是实际上有什么东西被覆盖了(但没有被截断)标记较少的文件—您看到的是较大XML文件的剩余部分
我从未见过linqtoxml本身做过这样的事情
您是否可以运行总是失败的相同测试,但每次迭代都会写入一个新文件,而不是覆盖旧文件
你有没有理由直接从
FileStreams
(正如另一个答案所指出的,这些流永远不会被关闭)加载,而不是仅仅使用XDocument.Load(filename)
,XDocument.Save(filename)
?我以前见过这个。。。就是想不出怎么解决。我认为这与你储蓄的方式有关。您需要确保覆盖所有内容。我不记得是文件模式还是选项。。。或者另一种设置我以前见过。。。就是想不出怎么解决。我认为这与你储蓄的方式有关。您需要确保覆盖所有内容。我不记得是文件模式还是选项。。。或者另一个设置您同时为同一个文件打开了两个文件流
。。。一个用于读取foo.xml
,另一个用于覆盖它。这似乎很成问题
我建议:
- 加载
后立即处理读取的XmlDocument
:FileStream
- 在写入
时使用FileStream
,以便在开始写入之前将文件截断为0字节FileMode.Truncate
文件流同时为同一文件打开。。。一个用于读取foo.xml
,另一个用于覆盖它。这似乎很成问题
我建议:
- 加载
XmlDocument
后立即处理读取的FileStream
:
- 在写入
FileStream
时使用FileMode.Truncate
,以便在开始写入之前将文件截断为0字节
完全正确。我与这个问题斗争了一段时间,但在.Save方面经验不足,但写入新文件解决了这个问题。似乎是一个有缺陷的设计,在编写之前没有删除原始文件或类似的内容。或者我只是运气不好:)谢谢@Eckstein:你确定没有多个线程来执行此操作吗?这是写入网络共享还是仅写入本地驱动器?这是一个多线程应用程序,但访问配置文件的线程不会超过一个。给本地硬盘写东西,没错。我与这个问题斗争了一段时间,但在.Save方面经验不足,但写入新文件解决了这个问题。似乎是一个有缺陷的设计,在编写之前没有删除原始文件或类似的内容。或者我只是运气不好:)谢谢@Eckstein:你确定没有多个线程来执行此操作吗?这是写入网络共享还是仅写入本地驱动器?这是一个多线程应用程序,但访问配置文件的线程不会超过一个。给本地驱动器写信。接得好。Xdocument.Load(newfilestream)…)
会打开一个悬空的文件。@Andrew很好。关闭filestreams后,我仍然会遇到错误,但似乎用truncate打开解决了这个问题。谢谢@Eckstein:如果这个解决方案有效,那么使用XDocument.Load
和config.Save(filename)
也应该有效。这就是我想的。。似乎应该是相同的执行引擎盖下。经过一些更多的测试负载和保存工作。DLL可能已过期。。谢谢,乔恩,接得好。Xdocument.Load(newfilestream)…)
会打开一个悬空的文件。@Andrew很好。关闭filestreams后,我仍然会遇到错误,但似乎用truncate打开解决了这个问题。谢谢@Eckstein:如果这个解决方案有效,那么使用XDocument.Load
和config.Save(filename)
也应该有效。这就是我想的。。似乎应该是相同的执行引擎盖下。经过一些更多的测试负载和保存工作。DLL可能已过期。。谢谢你,乔恩。
<?xml version="1.0" encoding="us-ascii"?>
<local>
<files>
<one>two</one>
<three>four</three>
</files>
</local>s>
</local>
using (FileStream fs = new FileStream(@"C:\foo.xml", FileMode.Open, FileAccess.Read))
{
config.Load(fs);
}