【问题标题】:R library "XML" doesn't recognize encodingR 库“XML”无法识别编码
【发布时间】:2020-10-22 21:16:01
【问题描述】:

问题

我有一个要在 R 中解析的 XML 文件。我知道这个文件没有损坏,因为以下 Python 代码似乎可以工作:

>>> import xml.etree.ElementTree as ET
>>> xml_tree = ET.parse(PATH_TO_MY_XML_FILE)
>>> do_my_regular_xml_stuff_that_seems_to_work_no_problem(xml_tree)

现在,当我尝试在 R 中运行以下代码时,我收到一条错误消息:

> library("XML")
> xml_tree <- XML::xmlParse(PATH_TO_MY_XML_FILE)

Error in nchar(text_repr): invalid multibyte string, element 1
Traceback:


好的,也许解析器无法识别编码。幸运的是,这应该在一个体面的 XML 文件中指定。所以,我去我的 shell 并检查:

$ head -n1 PATH_TO_MY_XML_FILE

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

现在,我可以返回到 R 并明确传递编码,只是面对我现在卡住的下一条错误消息:

> library("XML")
> xml_tree <- XML::xmlParse(PATH_TO_MY_XML_FILE, encoding='UTF-16')

Start tag expected, '<' not found
Error: 1: Start tag expected, '<' not found

Traceback:

1. XML::xmlParse(filePath, encoding = "UTF-16")
2. (function (msg, ...) 
 . {
 .     if (length(grep("\\\n$", msg)) == 0) 
 .         paste(msg, "\n", sep = "")
 .     if (immediate) 
 .         cat(msg)
 .     if (length(msg) == 0) {
 .         e = simpleError(paste(1:length(messages), messages, sep = ": ", 
 .             collapse = ""))
 .         class(e) = c(class, class(e))
 .         stop(e)
 .     }
 .     messages <<- c(messages, msg)
 . })(character(0))

检查文件是否实际上是“UTF-16”编码的最后一次尝试(在 R 中)产生:

> f <- file(filePath, 'r', encoding = "UTF-16")
> firstLine <- readLines(f, n=1)
> close(f)
> print(line)

[1] "<?xml version=\"1.0\" encoding=\"utf-16\"?>"

这对我来说看起来很合适。


问题

有人知道这里发生了什么吗?这是来自 XML 库的错误吗?该文件是否可能不是“UTF-16”编码的,即使它声称它是?当我将文件打印到 shell 中时,我看到的两个问号 ?? 是什么?正确读取文件时,这些问号不会出现...

【问题讨论】:

  • 请在文本编辑器中打开 XML 并在问题正文中发布其内容示例。格式正确的 XML 文件在标头声明之前不能有 任何 字符或实体(可见或不可见)。
  • 如果我用 Atom 打开文件,第一行的默认显示为��&lt;?xml version="1.0" encoding="utf-16"?&gt;,如果我选择 UTF-16 编码,第一行显示为&lt;?xml version="1.0" encoding="utf-16"?&gt;。文件前几个字符在我的 shell(例如 $ xxd PATH_TO_MY_FILE)中的十六进制转储产生:fffe 3c00 3f00 7800 6d00 6c00 2000 7600
  • 尝试使用 UTF-16 编码调整您的 R IDE 或会话。

标签: r xml parsing encoding utf-16


【解决方案1】:

这是来自 XML 库的错误吗?

我认为这里可能存在错误。如果我生成一个有效的 UTF-16 XML 文档,它将有一个 initial byte-order mark:

$ echo '<a>?</a>' | iconv -t utf-16 >a-utf16.xml
$ xxd a-utf16.xml 
00000000: fffe 3c00 6100 3e00 3dd8 0ade 3c00 2f00  ..<.a.>.=...<./.
00000010: 6100 3e00 0a00                           a.>...

然后我可以解析它:

> XML::xmlParse('a-utf16.xml')
<?xml version="1.0"?>
<a>&#x1F60A;</a>

但如果我指定编码,不是

> XML::xmlParse('a-utf16.xml', encoding='utf-16')
Start tag expected, '<' not found
Error: 1: Start tag expected, '<' not found

您最初的问题是您没有指定编码。然而:

我知道这个文件没有损坏,因为下面的 Python 代码似乎可以工作

这是一个很好的提示,但我认为您会发现不适用的极端情况。 Try iconv 对文件是否编码正确提出第二意见。

如需更具体的回复,您需要发布可重现的 XML 文件,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2017-03-12
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多