问题陈述:
您想对数据库中存储的XML数据强制执行XML模式有效性。
解:
Oracle提供了DBMS_XMLSCHEMA.REGISTERSCHEMA函数来定义Oracle数据库内的XML模式。为了验证生成的xml数据,我们需要注册模式。在注册架构时,格式必须与生成的xml格式匹配,或者根据您希望如何生成xml来注册架构。
该注册提供两个关键功能。首先,它使Oracle能够确定可从中获取模式的外部位置。其次(也是最重要的),REGISTERSCHEMA解析该模式以实现语法的正确性和完整性。
REGISTERSCHEMA函数可以从多个位置获取XML模式,例如以VARCHAR形式显示的文本以及BFILE或URI引用。
下面给出了执行xml模式验证的步骤。
注册架构
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;