如何在 R 中读取 UTF-8 编码的 XML 文件

How to read UTF-8 encoded XML file in R

提问人:user2877232 提问时间:12/15/2014 最后编辑:3442user2877232 更新时间:7/5/2020 访问量:1716

问:

我正在使用 Duncan Temple Lang 的 XML 包的 xmlParse 和 xPathApply 在 R 中读取 UTF-8 编码的 XML 文件。我在将文件中的文本读取到各种语言的数据框中时遇到问题。我目前在 Windows 操作系统上,但此 R 脚本将在不同的计算机上使用,因此我需要一个适合所有人的解决方案。请参阅下面的示例 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
    <L1 lang="zh-TW">使用者識別碼</L1>
    <L2 lang="vi-VN">ID người dùng</L2>
</CATALOG>

此文本值分别以 中的编码格式显示,如 所示。请注意,这只是一个示例,实际的 XML 文件包含不同语言的文本。<U+4F7F><U+7528><U+8005><U+8B58><U+5225><U+78BC>ID nguo`i du`ng

代码片段:

library(XML)
library(plyr)

getValues <- function(x) {
  List <- list()

  if(inherits(x, "XMLInternalElementNode")) {
    if(length(xmlValue(x, recursive=FALSE)) != 0) {
      List[[length(List)+1]] <- c(node = xmlName(x), value = xmlValue(x, recursive=FALSE))
    }
  }

return(List)
}

visitNode <- function(node, xpath = "//node()") {
  if (is.null(node)) {
    return()
  }

  result <- xpathSApply(node, path = xpath, getValues)

  if(is.list(result)) {
    dt <<- rbind.fill(lapply(result,function(y){as.data.frame(do.call(rbind, y),stringsAsFactors=FALSE)}))
  }
} 


xtree <- xmlParse("C:/Users/I308232/Desktop/test.xml")
root <- xmlRoot(xtree)
dt <- data.frame(node = NA, value = NA)
visitNode(root)
dt

sessionInfo() 输出:

R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_Australia.1252        LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RODBC_1.3-10 plyr_1.8.1   XML_3.98-1.1

loaded via a namespace (and not attached):
[1] Rcpp_0.11.3 tools_3.1.2

任何帮助将不胜感激。谢谢。

R XML 解析 数据帧

评论

2赞 MrFlick 12/15/2014
我不清楚你是如何提取这个的。你能使这个样品可重复吗?具体说明您是如何读取 XML 的。你用的是什么操作系统?您确定文件本身是否正确采用 UTF-8 编码?
0赞 user2877232 12/15/2014
我已经用代码片段更新了我的帖子。我目前在 Windows 操作系统上,但此 R 脚本将在不同的计算机上使用,因此我需要一个适合所有人的解决方案。
0赞 MrFlick 12/15/2014
好吧,Windows 通常默认为 Latin-1 编码。尝试在调用中添加显式。(至少当我在我的 Mac、R 3.1.0、XML 3.98-1.1 上测试时它有效)encoding="UTF_8"xmlParse()
0赞 user2877232 12/15/2014
我把它放进去,但没有运气。我仍然得到相同的输出。
1赞 MrFlick 12/15/2014
然后听起来文件可能编码不正确。你得到什么,我得到的似乎是字符串的正确 UTF-8 编码。charToRaw(dt$value[2])?49 44 20 6e 67 c6 b0 c6 a1 cc 80 69 20 64 75 cc 80 6e 67

答:

0赞 Hannah Jeffery 7/5/2020 #1

我不知道如何将 Excel 文件转换为不同的语言,但我希望这可以帮助您阅读文件。

当 Excel 电子表格的文件名和工作表名称具有不同的扩展名(即 .csv、.xlsx、.txt 等)时,RStudio 中可能会发生如下所示的 UTF-8 编码 XML 错误。

beantraitData = read_xlsx("traits_file_dev_sep.xlsx");
names(beantraitData)
"X..xml.version.1.0.encoding.UTF.8.."

在这种情况下,我遇到了一个错误,因为文件的名称是traits_file_dev_sep.xlsx的,而工作表的名称(您可以在页面底部附近的选项卡中看到)是traits_file_dev_sep.csv

在 Lubuntu 中将 .csv 文件转换为 .xlsx 文件后,这发生在我身上。