使用 XDocument 加载编码为 UTF 16 的 xml

Posted

技术标签:

【中文标题】使用 XDocument 加载编码为 UTF 16 的 xml【英文标题】:Loading xml with encoding UTF 16 using XDocument 【发布时间】:2011-06-01 21:55:44 【问题描述】:

我正在尝试使用 XDocument 方法读取 xml 文档。 但是当 xml 有时我得到一个错误

<?xml version="1.0" encoding="utf-16"?>

当我手动删除编码时。它工作得很好。

我收到错误“没有 Unicode 字节顺序标记。无法切换到 Unicode。

我尝试过搜索,然后我来到了这里-->

Why does C# XmlDocument.LoadXml(string) fail when an XML header is included?

但无法解决我的问题。

我的代码:

XDocument xdoc = XDocument.Load(path);

有什么建议吗??

谢谢。

【问题讨论】:

【参考方案1】:

您尝试读取的文件似乎未编码为 Unicode。您可以通过尝试打开一个编码为 ANSI 的文件来复制该行为,该文件在 XML 文件中的编码指定为 utf-16

如果不能确保文件正确编码,则可以将文件读入流(让StreamReader检测编码)然后创建XDocument

using (StreamReader sr = new StreamReader(path, true))

    XDocument xdoc = XDocument.Load(sr);

【讨论】:

我的 XML 输出被吐到 html 中。上述解决方案对我不起作用。我的 xml 文档文本中有一个版权符号 (c),当 HTML 进入浏览器时,它总是会出现乱码。所以我尝试编码(XML 编码 HTML 编码的字符串),但它实际上是在 HTML 中出现的。即 & 复制;在 xml 中,字面意思是 &copy;而不是预期的 ©以便浏览器可以显示 (c)。【参考方案2】:

我试过了,找到了另一种方法!!

XDocument xdoc = XDocument.Parse(System.IO.File.ReadAllLines(path));

【讨论】:

哇!这是新的,4.5刚刚发布! (2012-08-15 - 5 天前) :) 保持你的框架 Sangram 的方式! 据我所知,XDocument.Parse() 方法是新的,刚刚引入 .Net 4.5 框架。那是在 2012-08-15 发布的,当时是 5 天前......它只是一个补充,通常人们只是说谢谢你的补充。 :P 好的。谢谢你:)但我认为从 3.5 开始就存在,因为我仍在使用 3.5:P 检查msdn.microsoft.com/en-us/library/… 这不会为我编译,因为 Parse 方法接受一个字符串,而 ReadAllLines 方法返回一个字符串数组!不应该是ReadAllText吗? XDocument.Parse 需要一个字符串,因此 File.ReadAllLines 无法编译。您必须使用 File.ReadAllText。至少,这就是它在 VS2017 中为我工作的方式。【参考方案3】:

这段代码:

System.IO.File.ReadAllLines(path)

返回一个字符串数组。 正确的代码是:

System.IO.File.ReadAllText(path)

【讨论】:

好的。这是另一种方法。但 readAllLines 确实有效。 最好的方法,没有并发症。谢谢。

以上是关于使用 XDocument 加载编码为 UTF 16 的 xml的主要内容,如果未能解决你的问题,请参考以下文章

将 UTF-16 图像加载到内存中

使用C ++将越南语字符编码为USASCII,ISO88591,UTF8,UTF16BE,UTF16LE,UTF16

如何使用 C# 将 powershell 脚本编码为 base64 UTF16-LE 字符串

char 类型并将 ASCII 文本重新编码为 UTF-16

Stax 解析器无法读取编码为 UTF-16 的文件

如何防止XDocument添加XML版本和编码信息