在Oracle数据库中解析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> &

我有以下情况: 我有一个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>

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一起使用,但在处理可选值时遇到了困难,这种情况下是年龄元素

有人能给我一个建议帮我解决这个问题吗?非常感谢


善意的问候不是最好的,但可能有用:

说明:

  • LastName始终存在
  • 第一个表用于检测人数,您可以使用其他方式
  • 按同级元素位置提取数据
  • sql:

    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