Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当没有特定的字段来参数化解析的字符串时,如何解析XML家族中的字段&映射到它的右父级?

当没有特定的字段来参数化解析的字符串时,如何解析XML家族中的字段&映射到它的右父级?
EN

Stack Overflow用户
提问于 2021-08-07 10:10:55
回答 2查看 61关注 0票数 1

在我的输入XML中,父代中有多个“父代”家庭。在每个父代中,ChildRoots中可以有单个或多个"ChildRoot“系列。在这个层次结构中有4个字段需要解析。在Hive XPATH函数的帮助下,如何在不发生交叉联接的情况下实现这一点?在这种情况下,没有特定的字段来参数化解析的字符串,以便映射到它的右父级(Parents/ parent /ChildRoot/ChildRoot/)。

代码语言:javascript
运行
AI代码解释
复制
<Parents>
    <Parent>
        <ChildRoots>
            <ChildRoot>
                <FieldA>Field A info1</FieldA>
                <FieldB>Field B info1</FieldB>
                <FieldC>Field C info1</FieldC>
                <FieldD>Field D info1</FieldD>
            </ChildRoot>
        </ChildRoots>
    </Parent>
    <Parent>
        <ChildRoots>
            <ChildRoot>
                <FieldA>Field A info2</FieldA>
                <FieldC>Field C info2</FieldC>
                <FieldD>Field D info2</FieldD>
            </ChildRoot>
            <ChildRoot>
                <FieldA>Field A info3</FieldA>
                <FieldB>Field B info3</FieldB>
                <FieldD>Field D info3</FieldD>
            </ChildRoot>
        </ChildRoots>
    </Parent>
</Parents>

预期输出:

代码语言:javascript
运行
AI代码解释
复制
FieldA          FieldB          FieldC          FieldD
Field A info1   Field B info1   Field C info1   Field D info1
Field A info2                   Field C info2   Field D info2
Field A info3   Field B info3                   Field D info3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-08 05:53:32

使用count() XPATH函数可以计算每个级别上的元素数量。例如,XPATH_INT(xml, 'count(/Parents/Parent)')提供了2。使用横向视图posexplode为每个级别生成行,并使用分解位置参数化XPATH,因此所有这些XPATH都将具有一致的位置索引,并且不会发生交叉连接。

在这个例子中,<Parent>只有一个子<ChildRoots>,如果它是每个父<ChildRoots>中唯一的一个,你可以删除计数和分解的计算,这将会简化代码。我的代码允许每个<Parent>有多个<ChildRoots>

演示:

代码语言:javascript
运行
AI代码解释
复制
with mytable as (
select '<Parents>
    <Parent>
        <ChildRoots>
            <ChildRoot>
                <FieldA>Field A info1</FieldA>
                <FieldB>Field B info1</FieldB>
                <FieldC>Field C info1</FieldC>
                <FieldD>Field D info1</FieldD>
            </ChildRoot>
        </ChildRoots>
    </Parent>
    <Parent>
        <ChildRoots>
            <ChildRoot>
                <FieldA>Field A info2</FieldA>
                <FieldC>Field C info2</FieldC>
                <FieldD>Field D info2</FieldD>
            </ChildRoot>
            <ChildRoot>
                <FieldA>Field A info3</FieldA>
                <FieldB>Field B info3</FieldB>
                <FieldD>Field D info3</FieldD>
            </ChildRoot>
        </ChildRoots>
    </Parent>
</Parents>
' as xml
)

select --Get ChildRoot count and generate rows with position index, build final XPATH
       --xml, parent_pos, ChildRoots_pos, 
       --cr.pos+1 as ChildRoot_pos, --this expression used in xpath as is:
       XPATH_STRING(xml, concat('/Parents/Parent[',parent_pos,']/ChildRoots[',ChildRoots_pos,']/ChildRoot[',cr.pos+1,']/FieldA/text()')) as FieldA,
       XPATH_STRING(xml, concat('/Parents/Parent[',parent_pos,']/ChildRoots[',ChildRoots_pos,']/ChildRoot[',cr.pos+1,']/FieldB/text()')) as FieldB,
       XPATH_STRING(xml, concat('/Parents/Parent[',parent_pos,']/ChildRoots[',ChildRoots_pos,']/ChildRoot[',cr.pos+1,']/FieldC/text()')) as FieldC,
       XPATH_STRING(xml, concat('/Parents/Parent[',parent_pos,']/ChildRoots[',ChildRoots_pos,']/ChildRoot[',cr.pos+1,']/FieldD/text()')) as FieldD
from
( --Get ChildRoots count and generate rows with position index
select xml, parent_pos, crs.pos+1 as ChildRoots_pos
       --XPATH_INT(xml, concat('count(/Parents/Parent[',parent_pos,']/ChildRoots)')) as ChildRoots_cnt  
from
  ( --Get Parent count and generate rows with position index
    select  xml, p.pos+1 as parent_pos
          --XPATH_INT(xml, 'count(/Parents/Parent)') as Parent_cnt
     from mytable lateral view outer posexplode(split(space(XPATH_INT(xml, 'count(/Parents/Parent)')-1),'')) p as  pos, x
   ) p lateral view outer posexplode(split(space(XPATH_INT(xml, concat('count(/Parents/Parent[',parent_pos,']/ChildRoots)'))-1),'')) crs as  pos, x 
) crs lateral view outer posexplode(split(space(XPATH_INT(xml, concat('count(/Parents/Parent[',parent_pos,']/ChildRoots[',ChildRoots_pos,']/ChildRoot)'))-1),'')) cr as  pos, x        

结果:

代码语言:javascript
运行
AI代码解释
复制
fielda           fieldb           fieldc           fieldd
Field A info1    Field B info1    Field C info1    Field D info1
Field A info2                     Field C info2    Field D info2
Field A info3    Field B info3                     Field D info3  
票数 1
EN

Stack Overflow用户

发布于 2021-08-07 12:28:30

所需字段可按其名称查找,如下所示

代码语言:javascript
运行
AI代码解释
复制
xmllint --xpath '/Parents/Parent[1]/ChildRoots/ChildRoot[1]/child::*[name()="FieldA" or name()="FieldB" or name()="FieldC" or name()="FieldD"]' test.xml ; echo
# <FieldA>Field A info1</FieldA><FieldB>Field B info1</FieldB><FieldC>Field C info1</FieldC><FieldD>Field D info1</FieldD>

xmllint --xpath '/Parents/Parent[2]/ChildRoots/ChildRoot[1]/child::*[name()="FieldA" or name()="FieldB" or name()="FieldC" or name()="FieldD"]' test.xml ; echo
# <FieldA>Field A info2</FieldA><FieldC>Field C info2</FieldC><FieldD>Field D info2</FieldD>

xmllint --xpath '/Parents/Parent[2]/ChildRoots/ChildRoot[2]/child::*[name()="FieldA" or name()="FieldB" or name()="FieldC" or name()="FieldD"]' test.xml ; echo
# <FieldA>Field A info3</FieldA><FieldB>Field B info3</FieldB><FieldD>Field D info3</FieldD>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68694975

复制
相关文章
【Python学习】保姆级教学python中的解析和解析XML
我们经常需要解析用不同语言编写的数据。Python 提供了许多库来解析或拆分用其他语言编写的数据。在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML。
玖柒的小窝
2021/12/10
4K0
【Python学习】保姆级教学python中的解析和解析XML
SQL对Xml字段的操作
SQL Server 2005 引入了一种称为 XML 的本机数据类型。用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列;此外,还允许带有变量和参数。为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB)。
跟着阿笨一起玩NET
2018/09/18
2.2K0
SQL对Xml字段的操作
xml的解析
   XmlDocument doc=new XmlDocument();    StringReader sr=new StringReader(textBox1.Text);    XmlTextReader rd=new XmlTextReader(sr);    while(rd.Read())    {     //textBox2.Text +=rd.NodeType.ToString()+"\r\n";     if(rd.NodeType.ToString()=="Element")    
用户1075292
2018/01/23
3.7K0
XML的解析
昨天说了JSON解析,今天来看一下XML解析。在开发中需要对xml解析也是很常见的,跟JSON一样,大同小异。
一头小山猪
2020/04/10
3.1K0
SQL学习之计算字段的用法与解析
一、计算字段 1、存储在数据库表中的数据一般不是应用程序所需要的格式。大多数情况下,数据表中的数据都需要进行二次处理。下面举几个例子。 (1)、我们需要一个字段同时显示公司名和公司地址,但这两个信息存储在不同表的列中。 (2)、省份、城市、邮政编码存储在不同的列中(大多数情况下是这样),但邮件标签打印程序需要把它们作为一个有恰当顺序、格式的字段打印出来。 (3)、列数据是大小写混合的,但报表程序需要把所有的程序按大写表示出来。 (4)、物品订单表存储物品的价格和数量,不存储每个物品的总价格,但是打印发票需要
郑小超.
2018/01/24
1.2K0
SQL学习之计算字段的用法与解析
MongoDB 慢日志字段解析
随带一提,可以通过配置文件和db.setLogLevel()命令来设置整体的以及每个组件的日志级别。
phoenix、
2020/10/10
5.4K0
MongoDB 慢日志字段解析
HTTP首部字段完全解析
http协议是前端开发人员最常接触到的网络协议。在开发过程中,尤其是调试过程中避免不了需要去分析http请求的详细信息。在这其中头部字段提供的信息最多,比如通过响应状态码我们可以直观的看到响应的大致状态。那么你是否清楚http首部字段都有哪些,具体含义是什么,可选值又有哪些呢?看完下面的内容,我相信对于这几个问题你就会迎刃而解。
寻找石头鱼
2019/09/11
1.8K0
HTTP首部字段完全解析
SQL读取XML字段类型的信息
id  Paymentype  Refundrole    paypalTransactionId    openReason 1   REFUND       SELLER         5NE10254S0169263L  Item not received 
跟着阿笨一起玩NET
2018/09/18
1.2K0
MySQL字段类型最全解析
要了解一个数据库,我们必须了解其支持的数据类型。MySQL 支持大量的字段类型,其中常用的也有很多。前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇文章我们将把字段类型一网打尽,讲一讲常用字段类型的用法。
MySQL技术
2021/02/03
5.3K0
MySQL字段类型最全解析
它来了,它来了,Power BI的5月更新带着【字段参数】向你走来了
https://powerbi.microsoft.com/en-us/blog/power-bi-may-2022-feature-summary/
陈学谦
2022/05/25
8830
它来了,它来了,Power BI的5月更新带着【字段参数】向你走来了
SAP 采购定价过程字段解析
1、 步骤:代表了创建PO时,哪个条件类型放到前面,哪个放到后面,如果步骤号相同,那就以谁先选择出来谁就在前面。
matinal
2020/11/05
1.7K0
SAP 采购定价过程字段解析
SAP 采购定价过程字段解析
1、 步骤:代表了创建PO时,哪个条件类型放到前面,哪个放到后面,如果步骤号相同,那就以谁先选择出来谁就在前面。
matinal
2020/11/27
1.4K0
SAP 采购定价过程字段解析
xml文件的解析解析方式及Dom解析与Sax解析的区别
Dom解析的时候,首先要把整个文件读取完毕,装载到内存中。然后进行解析,在解析的过程中,你可以直接获取某个节点,进行操作,也可以获取根节点然后进行遍历操作,得到所有的节点。
MonroeCode
2018/01/12
1.8K0
xml文件的解析解析方式及Dom解析与Sax解析的区别
MySQL中的json字段
MySQL5.7.8中引入了json字段,这种类型的字段使用的频率比较低,但是在实际操作中,有些业务仍然在用,我们以此为例,介绍下json字段的操作方法:
AsiaYe
2019/12/23
9.3K0
如何不写一行代码把 Mysql json 字符串解析为 Elasticsearch 的独立字段
实战问题:有数百万数据需要导入 Elasticsearch 做性能对比测试,但当前数据存储在 Mysql 中,且核心字段以 Json 字符串形式存储。Mysql 存储如下所示:
铭毅天下
2021/03/22
2.8K0
如何不写一行代码把 Mysql json 字符串解析为 Elasticsearch 的独立字段
如何在PHP中解析XML
XML解析器是一个程序,它可以将XML文档或代码转换为XML文档对象模型(DOM)对象。
Lemon黄
2020/07/07
3.7K0
golang的xml、json解析
xml golang的xml处理主要应用Unmarshal、Marshal方法实现,解析一个xml到struct如下,首先是xml文件: <?xml version="1.0" encoding="u
用户1141560
2017/12/26
3K0
golang的xml、json解析
Java解析XML的实践
通过这段代码,重点是需要理解他的解析过程,就可以根据实际用到的XML格式,写出对应的解析逻辑。
bisal
2023/02/16
1K0
java解析XML的方法
1.DOM 实现方法 xml文件 <?xml version="1.0" encoding="utf-8"?> <Accounts> <Account type="type1">
HUC思梦
2020/09/03
1.1K0
点击加载更多

相似问题

当xml文档具有多层父级时,如何解析xml?

12

使用Java中的XML解析来检索字段

11

仅解析特定标记中的xml字段

20

用Python解析XML文件中的特定字段

21

解析xml中的重复字段

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档