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

时间:2018-03-23 22:13:32

标签: xml plsql xml-parsing oracle12c

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

如您所见,我有一个人物结构,通过重复结构包含人物定义:

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

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

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

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

有人可以给我一个小费o帮我解决这个问题吗?非常感谢!!!

亲切的问候

1 个答案:

答案 0 :(得分:1)

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

描述:

  1. LastName始终存在
  2. 第一张表用于检测人数,您可以使用其他方式
  3. 按兄弟元素的位置提取数据
  4. 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