ASP .NET Core如何写入XML文件

6
在ASP .NET Core中,我正在尝试向现有的XML文件中添加一些带属性的XML元素。
在ASP NET 4.5中,我将使用下面的代码来使其工作:
string path = Server.MapPath("~/Data/foo.xml");
XDocument xdoc = XDocument.Load(path);
   //Do stuff with XElement and XAttributes...
xdoc.Save(path);

但是在 ASP .NET Core 中,我不能使用 Server.MapPath(),所以我要使用 IHostingEnvironment 来获取完整路径。(点击这里了解更多)
在 ASP .NET Core 上运行下面的完整代码会导致 "无法将String转换为System.IO.Stream" 错误,当尝试运行 "xdoc.Save(pathToDataFile);" 时。
  var contentRoot = hostingEnvironment.ContentRootPath;
  string pathToDataFile = contentRoot + "\\Data\\foo.xml";
  XDocument xdoc = XDocument.Load(pathToDataFile);
    //Do stuff with XElement and XAttributes...
  xdoc.Save(pathToDataFile);

为什么 "xdoc.Save()" 在 ASP .NET Core 中不能正常工作,但在 .NET 4.5 中可以工作正常?


1
甚至没有阅读XDocument的文档,但问题很明显,在.NET Core上使用.Save函数时需要传入一个流来保存数据,而不是文件路径,因此需要创建一个文件流并将其传递给Save函数。 - Gusman
2个回答

6

.NET Core中提供的API是完整.NET框架中可用API的子集。在某些领域,你会发现几乎所有的.NET 4.5都可以在.NET Core中使用,但这并不总是如此。

在您的情况下,如果您使用Visual Studio查看Save 方法的重载,您将找到以下内容:

public void Save(Stream stream);
public void Save(TextWriter textWriter);
public void Save(XmlWriter writer);
public void Save(Stream stream, SaveOptions options);
public void Save(TextWriter textWriter, SaveOptions options);

你遇到编译错误的原因现在很清楚了。在.NET Core中,没有重载接受一个定义文档保存路径的字符串。
你需要先创建一个指向所需路径的可写 Stream,并将该 Stream 传递给 Save 方法。你可以参考完整的.NET Framework实现。请查看完整的.NET Framework实现

3
谢谢。我使用简单的FileStream解决了这个问题。 var fileStream = new FileStream(pathToDataFile, FileMode.Open); xdoc.Save(fileStream); - Andreas

6

我也遇到了同样的问题,使用FileStream解决了。

FileStream fileStream = new FileStream("file.xml", FileMode.Create);
XmlWriterSettings settings = new XmlWriterSettings() { Indent = true};
XmlWriter writer = XmlWriter.Create(fileStream, settings);

记得使用以下代码防止文件被截断。

writer.Flush();
fileStream.Flush();

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