繁体   English   中英

Oracle PL/SQL 使用 XMLTABLE 解析 xml 内的嵌套 object

[英]Oracle PL/SQL parsing a nested object within xml using XMLTABLE

大家,我有以下问题 - 我正在使用 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 表,以便为最终用户进一步可视化。 我可以用什么来实现我的目标。 我对这些做法有点陌生。 提前致谢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM