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 级路径目录