2017-06-14 53 views
1

我試圖得到XML的一個很好的代表......爲了簡單起見,假設我們有以下的XML使用XPath

<div> 
    <em>5</em> 
    <em></em> 
    <em></em> 
    <em>A</em> 
</div> 

理想我想檢索空非空節點將它轉換爲有一個列一些表:

| em | 
------ 
| "5"| 
| "" | 
| "" | 
| "A"| 

(我這裏使用的引號清楚地表明,我想空節點以及)

我試了幾個XPath查詢..一個最簡單的是我測試與R,在這裏我會得到

z = read_xml("<div> 
     <em>5</em> 
     <em></em> 
     <em></em> 
     <em>A</em> 
</div>") 
z 

xml_find_all(z,"//*[name() = 'em']/text()") 

{xml_nodeset (2)} 
[1] 5 
[2] A 

其他大多數問題是關於只能探測空/非空單元格..或選擇的第一個非空的..但我不知道怎樣才能使用這裏。

我有一個想法是試圖使用concat ...向所有節點添加一些字符串(包括空的字符串)。但是,這是Xpath 2.0解決方案(AFAIK),這不會是一個可行的解決方案。

最終解決方案(從XML中提取信息)將在Hive中實現。我使用一些Serde功能來獲取信息..然後將其存儲爲數組..然後我想將其轉換爲普通表...但是這是不可能的,如果由於長度差異而未檢索到缺失值

+0

這是否解決方案'// EM /串()'適用? – Andersson

+0

@Andersson太糟糕了,它不工作..試圖用R和Hive ..在那裏我只是用string()替換文本()。 我期望會有一個名爲content()或類似的東西......但我還沒有找到它。 我現在看到的唯一的解決方案,就是採取整個節點..後來使用一些正則表達式來減少不必要的部分。 – zwep

回答

0

R你可以這樣做:

library(xml2) 
library(magrittr) 
z = read_xml("<div> 
      <em>5</em> 
      <em></em> 
      <em></em> 
      <em>A</em> 
     </div>") 
z %>% 
    xml_find_all('em') %>% 
    xml_text() 

#> [1] "5" "" "" "A" 

或者,沒有管道:

library(xml2) 
xml_text(xml_find_all(z, 'em')) 
#> [1] "5" "" "" "A" 
+0

啊謝謝這個信息! Didnt知道這一點。 將研究這些函數的代碼,看看我是否可以在Hive中複製它。 – zwep