在 Oracle 数据库中解析 XML 文档分组元素(一些可选的)

Posted

技术标签:

【中文标题】在 Oracle 数据库中解析 XML 文档分组元素(一些可选的)【英文标题】:Parsing XML document Grouping Elements (some optional) in Oracle Database 【发布时间】:2018-03-23 22:13:32 【问题描述】:

我有以下情况: 我有一个 xml 文件,其中包含一个具有无限复杂类型的元素。

一个例子:

<Persons>
    <LastName>A</LastName>
    <FirstName>B</FirstName>
    <Age>1</Age>
    <LastName>C</LastName>
    <FirstName>D</FirstName>
    <Age>2</Age>
    <LastName>E</LastName>
    <FirstName>F</FirstName>
    <LastName>G</LastName>
    <FirstName>H</FirstName>
    <Age>4</Age>
</Persons>

如您所见,我有一个 Persons 结构,其中包含通过重复结构的人员定义:

   <LastName></LastName>
    <FirstName></FirstName>
    <Age></Age>

Age 元素是可选的,因此它可能会出现或出现在 xml 文档中。

我在 Oracle Database 12c 中使用 pl sql 过程来处理此 xml 消息,然后插入到一些表中。

我尝试将 XMLTABLE 与一些 Xquery 一起使用,但我在处理可选值时遇到了困难,这种情况是 AGE 元素吗?

谁能帮我解决这个问题?非常感谢!!!

亲切的问候

【问题讨论】:

【参考方案1】:

不是最佳的,但可能有用:

说明:

    姓氏始终存在 第一个检测人数表,你可以使用其他方式 按兄弟元素位置提取数据

sql:

select value( Persons ).extract( 'Persons/LastName[position()='||rownum||']/text()' ).getStringVal() LastName,
    value( Persons ).extract( 'Persons/LastName[position()='||rownum||']/following-sibling::*[position() = 1 and name() = ''FirstName'']/text()' ).getStringVal() FirstName,
    value( Persons ).extract( 'Persons/LastName[position()='||rownum||']/following-sibling::*[position() = 2 and name() = ''Age'']/text()' ).getNumberVal() Age
from table( xmlsequence( xmltype( '<Persons>
    <LastName>A</LastName>
    <FirstName>B</FirstName>
    <Age>1</Age>
    <LastName>C</LastName>
    <FirstName>D</FirstName>
    <Age>2</Age>
    <LastName>E</LastName>
    <FirstName>F</FirstName>
    <LastName>G</LastName>
    <FirstName>H</FirstName>
    <Age>4</Age>
</Persons>' ).extract( 'Persons/LastName' ) ) ) LastNames, table( xmlsequence( xmltype( '<Persons>
    <LastName>A</LastName>
    <FirstName>B</FirstName>
    <Age>1</Age>
    <LastName>C</LastName>
    <FirstName>D</FirstName>
    <Age>2</Age>
    <LastName>E</LastName>
    <FirstName>F</FirstName>
    <LastName>G</LastName>
    <FirstName>H</FirstName>
    <Age>4</Age>
</Persons>' ) ) ) Persons

【讨论】:

嗨,Hekko。感谢您的评论和解决方案。它很有用,可以帮助我解决我的问题。我同意这不是最优的,但对我来说已经足够好了。谢谢你。祝你有美好的一天。

以上是关于在 Oracle 数据库中解析 XML 文档分组元素(一些可选的)的主要内容,如果未能解决你的问题,请参考以下文章

DOM的概念和简单应用:使用DOM解析XML数据

如何在 Oracle 中通过 xmltype 解析 XML

xml

(33)ElasticSearch文档的核心元数据解析

oracle PL/SQL解析xml

Lua简单解析xml