Oracle PL/SQL 使用 XMLTABLE 解析 xml 中的嵌套对象

Posted

技术标签:

【中文标题】Oracle PL/SQL 使用 XMLTABLE 解析 xml 中的嵌套对象【英文标题】:Oracle PL/SQL parsing a nested object within xml using XMLTABLE 【发布时间】:2020-03-10 12:32:13 【问题描述】:

大家!我有以下问题 - 我正在使用 Oracle 11g,我正在尝试从 xml 文件中读取值,这是 Web 服务的响应。它有这样的结构:

<Response id="response">
             <ns14:StatusResponse>
                 <Code>3</Code>
                 <StatusName>Undefined</StatusName>
                 <FirstName>George</FirstName>
                 <MiddleName>Francis</MiddleName>
                 <LastName>Rosetown</LastName>
                 <Number>*******</Number>
                 <Gender>1</Gender>
                 <Relatives>
                     <Relative>
                         <OrderNumber>1</OrderNumber>
                         <FirstName>Louis</FirstName>
                         <MiddleName>Matel</MiddleName>
                         <LastName>Johnson</LastName>
                         <NUmber>********</Number>
                         <RelativeType>Spouse</RelativeType>
                     </Relative>
                     <Relative>
                         <OrderNumber>2</OrderNumber>
                         <FirstName>Jack</FirstName>
                         <MiddleName>Francis</MiddleName>
                         <LastName>Rosetown</LastName>
                         <EGN>**********</EGN>
                         <RelativeType>Son</RelativeType>
                     </Relative>
                 </Relatives>
                 <ReportDate>2019-09-05T15:22:42.6829678+03:00</ReportDate>
             </StatusResponse>
         </Response>

如何检索“相对”子节点的值?我将响应中的信息连接起来,并形成一个 html 表格,以便进一步可视化给最终用户。我可以用什么来实现我的目标。我对这些做法有点陌生。提前致谢。

【问题讨论】:

我忘了说,'Relative'节点每次可以是不同的数字。可以是1、2、7...等。 您可以使用docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb04cre.htm 开头。请小心,因为一些 XML 方法已被弃用。 【参考方案1】:

XMLTable 可以做到这一点。我必须对您的 XML 进行两个小改动 - 我删除了命名空间并修复了“NUMber”的大小写。我确信有一种方法可以处理 Oracle XML 中的名称空间,我只是没有使用它的经验。但您需要确保 XML 在语法上有效,否则将无法加载。

select OrderNumber, FirstName, MiddleName, LastName, EGN, RelativeType
from
(
    select xmltype('
    <Response id="response">
                 <StatusResponse>
                     <Code>3</Code>
                     <StatusName>Undefined</StatusName>
                     <FirstName>George</FirstName>
                     <MiddleName>Francis</MiddleName>
                     <LastName>Rosetown</LastName>
                     <Number>*******</Number>
                     <Gender>1</Gender>
                     <Relatives>
                         <Relative>
                             <OrderNumber>1</OrderNumber>
                             <FirstName>Louis</FirstName>
                             <MiddleName>Matel</MiddleName>
                             <LastName>Johnson</LastName>
                             <Number>********</Number>
                             <RelativeType>Spouse</RelativeType>
                         </Relative>
                         <Relative>
                             <OrderNumber>2</OrderNumber>
                             <FirstName>Jack</FirstName>
                             <MiddleName>Francis</MiddleName>
                             <LastName>Rosetown</LastName>
                             <EGN>**********</EGN>
                             <RelativeType>Son</RelativeType>
                         </Relative>
                     </Relatives>
                     <ReportDate>2019-09-05T15:22:42.6829678+03:00</ReportDate>
                 </StatusResponse>
             </Response>') relative_xml
    from dual
), xmltable('/Response/StatusResponse/Relatives/Relative'
    passing relative_xml
    columns
        OrderNumber number path 'OrderNumber',
        FirstName varchar2(4000) path 'FirstName',
        MiddleName varchar2(4000) path 'MiddleName',
        LastName varchar2(4000) path 'LastName',
        EGN varchar2(4000) path 'EGN',
        RelativeType varchar2(4000) path 'RelativeType'
);

结果:

ORDERNUMBER  FIRSTNAME  MIDDLENAME  LASTNAME  EGN         RELATIVETYPE
-----------  ---------  ----------  --------  ----------  ------------
          1      Louis       Matel   Johnson                    Spouse
          2       Jack     Franci   Rosetown  **********           Son

【讨论】:

以上是关于Oracle PL/SQL 使用 XMLTABLE 解析 xml 中的嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章

Oracle XMLTable / XMLTYPE(不知道)

如何在 oracle XMLTYPE XMLTABLE 中支持 1 级路径目录

Oracle XMLtable 提供交叉连接的数据

Oracle XMLTABLE - 如何从 XMLType 中删除节点?

oracle pl/sql 基础

Oracle PL/SQL语句基础学习笔记(上)