在Oracle数据库中解析XML文档分组元素(某些可选)
我有以下情况: 我有一个xml文件,其中包含一个具有无限复杂类型的元素 例如:在Oracle数据库中解析XML文档分组元素(某些可选),xml,plsql,xml-parsing,oracle12c,Xml,Plsql,Xml Parsing,Oracle12c,我有以下情况: 我有一个xml文件,其中包含一个具有无限复杂类型的元素 例如: <Persons> <LastName>A</LastName> <FirstName>B</FirstName> <Age>1</Age> <LastName>C</LastName> <FirstName>D</FirstName> &
<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>
A.
B
1.
C
D
2.
E
F
G
H
4.
如您所见,我有一个Persons结构,通过重复该结构包含person定义:
<LastName></LastName>
<FirstName></FirstName>
<Age></Age>
年龄元素是可选的,因此它可能出现在xml文档中或xml文档中。
我在Oracle数据库12c中使用一个pl sql过程来处理这个xml消息,然后插入到一些表中
我尝试将XMLTABLE与一些Xquery一起使用,但在处理可选值时遇到了困难,这种情况下是年龄元素
有人能给我一个建议帮我解决这个问题吗?非常感谢
善意的问候不是最好的,但可能有用: 说明:
select value(Persons).extract('Persons/LastName[position()='| | | | |']/text()).getStringVal()LastName,
值(Persons)。提取('Persons/LastName[position()='| | | rownum | | | |]]以下同级::*[position()=1和name()='FirstName']/text())。getStringVal()FirstName,
值(Persons)。提取('Persons/LastName[position()='| | | rownum | | | |]]以下同级::*[position()=2和name()='Age']/text())。getNumberVal()年龄
来自表(xmlsequence(xmltype('
A.
B
1.
C
D
2.
E
F
G
H
4.
提取('Persons/LastName'))LastNames,表(xmlsequence(xmltype('
A.
B
1.
C
D
2.
E
F
G
H
4.
))人
Hi-Hekko。感谢您的评论和解决方案。它是有用的,帮助我解决我的问题。我同意这不是最优的,但对我来说已经足够了。非常感谢。祝您有个美好的一天。
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