使用XDocument加载UTF-16编码的XML

44

我正在尝试使用XDocument方法读取XML文档,但是当XML中出现

时,我遇到了错误。

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

当我手动删除编码时,它可以正常工作。

我遇到了错误 "没有 Unicode 字节顺序标记。无法切换到 Unicode。"

我尝试搜索并最终找到这里-->

为什么在包含 XML 头的情况下,C# XmlDocument.LoadXml(string) 会失败?

但是没有解决我的问题。

我的代码:

XDocument xdoc = XDocument.Load(path);
任何建议吗?谢谢。
3个回答

68

看起来你尝试读取的文件没有使用Unicode编码。你可以通过尝试用XML文件中指定的utf-16编码打开以ANSI编码的文件来复制这种行为。

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

using (StreamReader sr = new StreamReader(path, true))
{
    XDocument xdoc = XDocument.Load(sr);
}

我将XML的输出转换为HTML。上述解决方案对我无效。我的XML文档文本中有版权符号(c),当HTML到达浏览器时,它总是会变得混乱。因此,我尝试编码(XML编码HTML编码的字符串),但它实际上以HTML的形式呈现。即在xml中&copy;实际上以&copy;而不是预期的©出现,以便浏览器可以显示(c)。 - Moiz Tankiwala

10

我尝试了一下,发现还有另一种方法可以做到!

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

1
哇!这是新的,4.5刚刚发布了!(2012-08-15 - 5天前):)保持对框架的关注,Sangram! - Arvo Bowen
从我所了解的情况来看,XDocument.Parse() 方法是 .Net 4.5 框架中新引入的。该框架于2012-08-15发布,当时距今仅有5天... 它只是一个补充,通常人们只会因赞美而表示感谢。:P - Arvo Bowen
LOL!! 不需要道歉。至少我们都学到了新东西。 :) - Sangram Nandkhile
4
这段代码无法编译,因为Parse方法需要一个字符串作为参数,而ReadAllLines方法返回的是一个字符串数组!这应该改成ReadAllText方法吗? - Iain Ward
2
XDocument.Parse期望一个字符串,所以File.ReadAllLines无法编译。你必须使用File.ReadAllText。至少在VS2017中这是我的工作方式。 - Tyler Jones
显示剩余2条评论

7
这段代码:
System.IO.File.ReadAllLines(path)

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

System.IO.File.ReadAllText(path)

1
好的,这是另一种方法。但是readAllLines确实是有效的。 - Sangram Nandkhile
最好的方法,没有复杂性。谢谢。 - Vulovic Vukasin

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