【问题标题】:How to parse a schema with XMLTYPE in oracle如何在 oracle 中使用 XMLTYPE 解析模式
【发布时间】:2017-01-22 07:32:56
【问题描述】:

我正在尝试创建一个流程,该流程将在生产环境中检查我们在 XML 模式中所做的更改是否已部署。这些文件保存在 Oracle DB 中,因此我正在考虑使用 XMLTYPE.extract ....

问题是 xpath 无法解析架构。

如果这是我的架构

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="TRB_TRX">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="HEADER">
                <xs:complexType>
                    <xs:attribute name="ReqNotf" type="xs:string" use="optional" default="N"/>

我希望能够做到

SELECT XMLTYPE(COLUMN).EXTRACT('//xs:attribute[@name="ReqNotf"]/@type').getStringVal() 
From .....

【问题讨论】:

  • 您遇到了什么问题?无论如何,您必须声明使用的命名空间。
  • 我正在运行以下查询(例如): select extractValue(xmltype(FILE_DATA), '//xs:element/@name/text()') from MY_TABLE 并得到错误:" ORA-31011: XML 解析失败 ORA-19202: XML 处理出错 LPX-00601: Invalid token in: '//xs:element/@name/text()'. and getting "

标签: xml oracle xsd xmltype


【解决方案1】:

试试类似的东西

 EXTRACT(col,'//xs:attribute[@name="ReqNotf"]/@type', 
  'xmlns:xs="http://www.w3.org/2001/XMLSchema"').getStringVal() as val

例子

SELECT EXTRACT(col,'//xs:attribute[@name="ReqNotf"]/@type', 'xmlns:xs="http://www.w3.org/2001/XMLSchema"').getStringVal() as val
From (
select 
XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="TRB_TRX">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="HEADER">
                <xs:complexType>
                    <xs:attribute name="ReqNotf" type="xs:string" use="optional" default="N"/>
                </xs:complexType> 
           </xs:element>  
        </xs:sequence>           
    </xs:complexType>
</xs:element>
</xs:schema>') as COL from dual
);

 VAL 
-------------
xs:string 

不要使用COLUMN 作为保留的列名。

还可以考虑使用 XMLTABLE - EXTRACT 是 deprecated

【讨论】:

  • 欢迎来到 SO。如果它有帮助,您可以对答案进行投票,如果它是正确的,您甚至可以接受它:)
猜你喜欢
  • 2023-03-23
  • 2019-09-02
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多