使用xpath检索空节点和非空节点

vsdwdz23  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(375)

我正在尝试获得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。。。向所有节点(包括空节点)添加一些字符串。但是,这是一个XPath2.0解决方案(afaik),这将不是一个可行的解决方案。
最终的解决方案(从这个xml中提取信息)将在hive中实现。我使用一些serde功能来获取信息。。然后存储为数组。。然后我想把它转换成一个普通的表。。但如果由于长度差异而未检索到缺少的值,则这是不可能的

3pmvbmvn

3pmvbmvn1#

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"

相关问题