2017-08-31 58 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。