我正在尝试很好地表示XML ...为了简单起见,我们假设我们有以下XML
<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 :(得分: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"
答案 1 :(得分:0)
可以在 Hive 中使用 xpath() 来实现。不幸的是,Hive 实现了 xpath 1.0。因此,无法访问有助于以更优雅的方式处理缺失值的函数。
我可以处理它的唯一方法是在 xpath 表达式中使用“或”语句,当 xpath 值为空时,该语句将输出默认值。 在您的情况下,没有默认元素,因此我使用 regexp_replace() 创建了一个:
select xplode.*
from (select 0) t
lateral view explode(xpath(regexp_replace('<div><em>5</em><em></em><em></em><em>A</em></div>', '<em>','<em dflt = "">'),'div/em/text()| div/em[not(./text())]/@dflt')) xplode as em;