2017-08-31 93 views
0

我试图从http://www.kavita-ganesan.com/entity-ranking-data解析无效的XML中的R

提供的数据存储库解析汽车检讨数据集是格式化为

<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解析,但是,我不知道是否有一个更优雅的解决方案在那里。

+0

对我来说看起来不错/优雅。 –

+0

谢谢@Aurèle。但我想知道是否有更高效的解决方案,不需要两次读取数据并使用gsub。 – comendeiro

回答

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> 
+0

感谢您采用这种替代方法。它完成这项工作,但是仍然需要额外的步骤从变量中移除标签。是不是通过数据一次性读取所有数据? – comendeiro

+0

除了用像sed这样的工具预处理数据之外,我还没有看到......(还) –

+0

最后,你的回答对我来说非常有用。我尝试将它解析为XML时遇到了一些问题,因此我选择将其作为文本对待并逐行解析。 – comendeiro

0

创建包装文件是这样的:

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

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

从技术上讲,您的输入是一个格式良好的外部一般解析实体,但它不是一个格式良好的文档实体。有效性没有涉及到,因为没有模式或DTD。