如何在Oracle中执行模式注册和XML验证?

问题陈述:
您想对数据库中存储的XML数据强制执行XML模式有效性。

解:

Oracle提供了DBMS_XMLSCHEMA.REGISTERSCHEMA函数来定义Oracle数据库内的XML模式。为了验证生成的xml数据,我们需要注册模式。在注册架构时,格式必须与生成的xml格式匹配,或者根据您希望如何生成xml来注册架构。

该注册提供两个关键功能。首先,它使Oracle能够确定可从中获取模式的外部位置。其次(也是最重要的),REGISTERSCHEMA解析该模式以实现语法的正确性和完整性。

REGISTERSCHEMA函数可以从多个位置获取XML模式,例如以VARCHAR形式显示的文本以及BFILE或URI引用。

 下面给出了执行xml模式验证的步骤。

  1. 注册架构

DECLARE
  l_schema CLOB;
BEGIN

l_schema := '<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="customer_id" type="xs:positiveInteger"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="order_id" type="xs:positiveInteger"/>
<xs:element name="status" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="order">
<xs:complexType>
<xs:sequence>
<xs:element ref="order_id"/>
<xs:element ref="status"/>
</xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element ref="customer_id"/>
<xs:element ref="email"/>
<xs:element ref="name"/>
<xs:element ref="order" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'

--In SCHEMAURL , provide the schema name of your choice
DBMS_XMLSCHEMA.REGISTERSCHEMA(SCHEMAURL       => 'xml_schema_test.xsd',
                                SCHEMADOC       => l_schema,
                                LOCAL           => TRUE,
                                GENTYPES        => FALSE,
                                GENTABLES       => FALSE,
                                ENABLEHIERARCHY => DBMS_XMLSCHEMA.ENABLE_HIERARCHY_NONE);


END;

检查是否创建了架构。

示例

SELECT schema_url FROM user_xml_schemas;

输出结果

-- Output
xmtest_schema.xsd
  • 以防万一必须删除架构。参考下面的代码

3)如果创建的架构需要删除。

BEGIN
     DBMS_XMLSCHEMA.DELETESCHEMA(
     SCHEMAURL=> 'xml_schema_test.xsd',
     DELETE_OPTION => DBMS_XMLSCHEMA.DELETE_CASCADE_FORCE);
END;
  • 根据使用XMLISVALID函数创建的架构验证xml。

XMLISVALID: XMLISVALID检查输入的XMLType_instance是否符合相关的XML模式。如果架构有效,则结果为1,否则为0。

示例

CREATE TABLE t1 ( xml XMLTYPE);

INSERT INTO t1 VALUES ('<?xml version="1.0"?>
<customer>
   <customer_id>134</customer_id>
   <email>taylor.cauchon@internalmail</email>
   <name>Taylor Cauchon</name>
   <order>
      <order_id>921</order_id>
      <status>COMPLETE</status>
   </order>
   <order>
      <order_id>485</order_id>
      <status>COMPLETE</status>
   </order>
   <order>
      <order_id>1528</order_id>
      <status>COMPLETE</status>
   </order>
   <order>
      <order_id>1672</order_id>
      <status>COMPLETE</status>
   </order>
   <order>
      <order_id>1319</order_id>
      <status>COMPLETE</status>
   </order>
</customer>
');

SELECT XMLISVALID(xml, 'my_schema.xsd') AS is_valid
  FROM t1;