C# 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> <

我正在使用XDocument加载和保存配置文件。大多数情况下,它都能正常工作,但在某些情况下(似乎是随机的),它会在最后一个标记后附加额外的信息。下面是发生的事情的要点

配置文件预运行:

<?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
    时使用
    FileMode.Truncate
    ,以便在开始写入之前将文件截断为0字节

您有两个
文件流同时为同一文件打开。。。一个用于读取
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);
}