【发布时间】: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 打开文件,第一行的默认显示为
��<?xml version="1.0" encoding="utf-16"?>,如果我选择 UTF-16 编码,第一行显示为<?xml version="1.0" encoding="utf-16"?>。文件前几个字符在我的 shell(例如$ xxd PATH_TO_MY_FILE)中的十六进制转储产生:fffe 3c00 3f00 7800 6d00 6c00 2000 7600 -
尝试使用 UTF-16 编码调整您的 R IDE 或会话。
标签: r xml parsing encoding utf-16