如何将 XML 包装在虚拟根目录下

How to wrap XML under virtual root

我试图在没有根元素的情况下加载 XML。我想使用 LINQ 来 XML.

以下答案:我重新创建了这段代码:

var doc = File.ReadAllText(Path.Combine(Settings.GameFolderPath, path));  
var rootedDoc = "<root>" + doc + "</root>";
XDocument correctDoc = XDocument.Parse(rootedDoc);

但我在 XDocument.Parse()、第 1 行、位置 9 上得到 XML异常“意外的 XML 声明”。使用 File.WriteAllText(path, rootedDoc) 我知道第一行看起来像预期的那样:<root><?xml version="1.0" encoding="utf-16"?>。它必须以某种方式在我链接的答案中工作,但我不明白如何,你如何在包装原始文件后先保持声明?

这是因为 XML 版本 1.0 指定 XML 声明(<? ... ?> 部分)是可选的,这意味着,链接的答案可能只是忽略了它,或者只是忽略了它未使用包含它的 XML 进行测试。最简单的部分是在解析文件之前删除 XML 声明,如下所示:

xml = xml.TrimStart("<?xml version=\"1.0\" encoding=\"utf-16\"?>");
xml = $"<root>{xml}</root>";

如果 XML 是手动创建的/可以在将其传递给代码之前手动编辑,您始终可以手动将其删除,但我不推荐这样做,因为那样的话您的程序会崩溃正在摄取(否则*)有效的 XML 个文件。


*XML 具有多个根元素的文件在技术上已经无效 XML 文件