在 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 文档分组元素(一些可选的)的主要内容,如果未能解决你的问题,请参考以下文章