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

oraclesoftware & codingprogramming更新于 2025/6/3 0:52:17

问题描述:
您希望对数据库中存储的 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;

检查 schema 是否已创建。

示例

SELECT schema_url FROM user_xml_schemas;

输出

-- 输出
xmtest_schema.xsd
  • 以防万一需要删除 schema。请参阅以下代码

3) 如果需要删除已创建的 schema。

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;


相关文章