我正在使用 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>
此文本值以编码格式显示,如
<U+4F7F><U+7528><U+8005><U+8B58><U+5225><U+78BC>
, ID nguo`i du`ng
分别。请注意,这只是一个示例,实际的 XML 文件包含不同语言的文本。代码片段:
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
任何帮助将不胜感激。谢谢。
最佳答案
我不知道如何将 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 .在我将 .csv 文件转换为 Lubuntu 中的 .xlsx 文件后,这发生在我身上。
关于xml - 如何在 R 中读取 UTF-8 编码的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27476727/