解析R中的无效XML

时间:2017-08-31 09:17:03

标签: r xml parsing xml-parsing

我试图解析http://www.kavita-ganesan.com/entity-ranking-data

提供的存储库中的汽车审核数据集

数据是一系列包含格式为

的文本的文件
<DOC>
<DATE>Some Text</DATE>
<AUTHOR>Some Text</AUTHOR>
<TEXT>Some Text</TEXT>
<FAVORITE>Some text</FAVORITE>
</DOC>
<DOC>
<DATE>Some Text</DATE>
<AUTHOR>Some Text</AUTHOR>
<TEXT>Some Text</TEXT>
<FAVORITE>Some text</FAVORITE>
</DOC>
.....

这不是有效的XML,尽管它看起来像XML。

我想通过在文本的开头和结尾附加标记<file></file>来强制它成为有效的XML。

library(XML)

#read the file and append the tags
file = c("<file>",readLines("2007/2007_nissan_versa"),"</file>")

#remove invalid characters
file = gsub(pattern = "[&\"\']",replacement = "",x = file)

xmlParse(file)

它确实有效,然后它可以被xmlParse解析,但是,我想知道是否有更优雅的解决方案。

2 个答案:

答案 0 :(得分:1)

你真的对我看起来很好。

这更像是scan()的玩具答案,它显示了解析此类文件的不同方式:

data.frame(scan(
  textConnection("<DOC>
<DATE>Some Text</DATE>
<AUTHOR>Some Text</AUTHOR>
<TEXT>Some Text</TEXT>
<FAVORITE>Some text</FAVORITE>
</DOC>
<DOC>
<DATE>Some Text</DATE>
<AUTHOR>Some Text</AUTHOR>
<TEXT>Some Text</TEXT>
<FAVORITE>Some text</FAVORITE>
</DOC>"),
  what = list(X1="", DATE="", AUTHOR="", TEXT="", FAVORITE="", X2=""),
  multi.line = TRUE,
  sep = "\n"
), stringsAsFactors = FALSE)

#      X1                   DATE                     AUTHOR                   TEXT                       FAVORITE     X2
# 1 <DOC> <DATE>Some Text</DATE> <AUTHOR>Some Text</AUTHOR> <TEXT>Some Text</TEXT> <FAVORITE>Some text</FAVORITE> </DOC>
# 2 <DOC> <DATE>Some Text</DATE> <AUTHOR>Some Text</AUTHOR> <TEXT>Some Text</TEXT> <FAVORITE>Some text</FAVORITE> </DOC>

答案 1 :(得分:0)

创建一个这样的包装器文档:

<!DOCTYPE wrapper [
<!ENTITY e SYSTEM "actual.xml">
]>
<wrapper>&e;</wrapper>

其中“actual.xml”是您当前的文件(在同一目录中);然后解析包装文档。

从技术上讲,您的输入是格式良好的外部常规解析实体,但它不是格式良好的文档实体。有效性没有进入,因为没有架构或DTD。