2015-11-30 21 views
2

我是一個XML新手,試圖抓取和分析以下RSS源http://xml.newsbox.ch/corporate_web/che/dufry/digest_en_year_2015_atom.xml。除了這一點,我遇到了兩個問題:在R中分析具有可變XML結構的RSS源

1)我想提取的分析的文檔使用xmlChildren個別新聞報道的節點如下:

library(RCurl) 
library(XML) 
xml.url <- "http://xml.newsbox.ch/corporate_web/che/dufry/digest_en_year_2015_atom.xml" 
script <- getURL(xml.url) 
doc <- xmlParse(script) 
doc.children = xpathApply(doc,"//entry",xmlChildren) 

雖然這個程序運作良好其他飼料,其中各個新聞發佈與節點<items>一起存儲,其在節點<entry>的這種特殊情況下不起作用,因爲它返回空列表。我被困在這裏,因爲我無法弄清楚我在XML文檔結構中錯過了什麼。

2)更一般地說:當XML結構在節點<item>或節點<entry>中包含單個新聞故事時,是否可以實現這種方法來處理這兩種情況,而無需事先知道特定的結構?

任何幫助非常感謝,謝謝。

回答

2

您需要使用命名空間。下面是XMLxml2選項:

# XML 
ns <- xmlNamespaceDefinitions(doc, simplify=TRUE) 
names(ns)[1] <- "x" 
nodes <- getNodeSet(doc, "//x:entry", namespaces=ns) 

# xml2 
library(xml2) 

XML_URL <- "http://xml.newsbox.ch/corporate_web/che/dufry/digest_en_year_2015_atom.xml" 
doc <- read_xml(XML_URL) 
ns <- xml_ns_rename(xml_ns(doc), d1="x") 
xml_find_all(doc, "//x:entry", ns=ns) 

看使用boolean() XPath operator,以便能夠處理多個箱子(即,不同的訂閱源格式)。

+0

謝謝,這個作品很棒!我不知道boolean()XPath運算符,但我認爲'xpathApply(doc,「boolean(// x:entry)」,namespaces = ns)'在這裏完成這項工作。 – Nico21

+0

感興趣:'xpathApply(doc,「// x:entry」,xmlChildren,namespaces = ns)'效果很好。但是,在其他情況下(https://www.barry-callebaut.com/news/rss.xml),當xpathApply(doc,「// item」,xmlChildren)「運行良好時,xpathApply(doc, 「// x:item」,xmlChildren,namespaces = ns)'返回一個空列表。有沒有辦法一般地告訴什麼時候使用命名空間? – Nico21

+0

我想這種行爲可以歸因於默認命名空間與非默認命名空間,因爲'xmlNamespaceDefinitions'在前一種情況下返回'「」''。 – Nico21

1

這可能不完全回答你的問題,但你有沒有考慮使用現成的包,如tm.plugin.webmining

如果您不想使用該軟件包,仍然可以檢查代碼並查看他們如何分析數據。

+0

謝謝你參考這個包!我一定會看看它。 – Nico21