处理 XDocument 对象

7

如何“处理”XDocument对象?我正在使用它来解析XML字符串,然后将文件保存到文件系统中。在同一个方法中,我需要访问此文件并运行命令行工具。

代码如下:

string filepath = "...";
string filename = "...";
XDocument xdoc = XDocument.Parse(xmlString);
xdoc.Save(filepath + filename);

Process p = Process.Start(new ProcessStartInfo("rst.exe", args)); // the args use the file saved above

我在调用命令行工具的那一行设置了断点,然后试图手动打开文件,但在停止调试器之前无法加载该文件。
编辑: 感谢回答。我已经缩小了问题范围...在保存文件后,在"Process p = ..."上设置断点时,我可以打开文件,但是我无法使用"http://qualifiedapppath/path/file.xml"访问它,并且我正在使用的命令行工具只接受URL作为参数。在停止调试器之后,我可以通过http访问该文件。是什么进程阻止了在方法运行时对其进行访问?

你遇到了什么错误? - jags
没有收到任何错误信息,命令行工具无法执行,因为(我猜测)它无法访问该文件。 - notAnonymousAnymore
你好,只是好奇,您能否手动在记事本中打开已创建的文件并进行编辑? - jags
1
顺便提一下,“Path.Combine”是组合路径和文件名的首选方法;但是在此处无需执行任何操作-不需要释放等。 - Marc Gravell
感谢所有的评论。我已经在上面进行了编辑。 - notAnonymousAnymore
如果文件在同一台计算机上,请尝试使用 file:///C:/.... - jags
3个回答

7

XDocument是一个类,它存储了XML文档的内存副本。类实现IDisposable接口是因为它们使用除内存之外的非托管资源。由于内存已经被垃圾回收器很好地管理,因此XDocument只需要消耗内存,不需要Dispose方法。


3
不需要 - XDocument甚至没有实现IDisposable接口。XDocument和XElement类在内部使用XmlReader并为您处理底层读取器的释放。只需右键单击XDocument类并选择“转到定义”,您可能无法找到此类实现IDisposable。
要回收内存,请将XDocument对象引用设置为null,GC将回收已获取的内存。
补充说明:对于您问题的第二部分,如果文件在本地可用,则可以使用此Uri:
var uri = new Uri("file:///C:/path/file.xml");

您可以使用以下代码验证文件位置:

您也可以使用这段代码来验证文件位置:

if (uri.IsFile)
{
    var filePath = uri.LocalPath; // C:/path/file.xml
}

如果在IIS中配置了虚拟目录以定位该文件,则可以使用HTTP。


2
你不需要通过GC将XDocument对象引用设置为null。这是不必要的。 - thewpfguy
非常感谢!我在WixSharp安装程序中使用了XElement,它一直保持着我更新的应用程序设置文件的打开状态,不允许安装程序在安装后启动应用程序(文件被另一个进程使用错误)。将XElement变量设置为null(在我的更新之后)解决了这个问题。文件已释放。应用程序已启动。再次感谢。 - Doug J. Huras

1

它没有实现IDisposable接口,所以如果你只想释放它的内存,将所有引用设置为null,垃圾回收器会在需要时将其删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接