ASP .NET Core 写入 XML-文件

ASP .NET Core write to XML-file

在 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 获取完整路径:(阅读更多 here

运行 下面 ASP .NET Core 上的完整代码在尝试 运行 "xdoc.Save(pathToDataFile);" 时将导致 "Cannot convert from String to System.IO.Stream" ??

  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 中工作正常?

.NET Core 中可用的 API 是完整 .NET 框架中可用 API 的子集。在某些领域,您会发现 .NET Core 中几乎包含 .NET 4.5 中的所有内容,但情况并非总是如此。

对于您的情况,如果您使用 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 中,没有接受 string 定义应保存文档的文件路径的重载。

您必须首先创建指向所需路径的 write-enabled Stream,然后将 Stream 传递给 Save 方法。你可以看看full .NET framework implementation作为参考。

我遇到了同样的问题,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();