使用PL SQL针对XSD验证XML

时间:2014-05-24 11:01:02

标签: xml oracle validation plsql xsd

我正在尝试这个项目,我有一个Oracle数据库,我在其中将XML和XSD存储在不同的表中。两个表都有一个包含文档的xmltype列(我使用的是带有XML DB的Oracle 11g xe)。

这个想法是有一个函数可以根据函数中的一个模式验证一个XML,并根据验证结果返回true或false,但我不知道如何处理这个问题。

我在http://docs.oracle.com/cd/B28359_01/appdev.111/b28369/xdb08tra.htm#i1026778做了一些研究但没有取得多大成功,因为所有的解释都假设架构在本地文件系统中,而不是在我的数据库中的表中。此外,在解释XMLIsValid函数时,他们谈论的是XML实例,我不确定我理解它们的意思或者如何理解它(我刚刚开始学习PL SQL和我&m; m根本没有信心使用它。)

目前,W3schools的XML和模式都是非常简单的例子,因为文档的内容现在对我来说并不像找到如何使验证工作那么重要。

有谁能告诉我如何做到这一点的例子?此外,任何线索或线索都会对我有帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用以下示例:

  1. 您需要注册架构。

  2. 您需要同时获取文件和架构。

  3. 使用xmlisvalid作为检查有效性的函数


     DECALRE
    
     registered_ NUMBER;
     data_  CLOB;
     schema_ CLOB;
     xml_    XMLTYPE;
     valid_  NUMBER;
    
     CURSOR get_schema_ IS
        SELECT content 
        FROM schema_table_
        WHERE file_name = 'schema_name_';
    
     CURSOR get_file_ IS
        SELECT content 
        FROM file_table_
        WHERE file_name = 'file_name_';
    
     CURSOR check_register IS
        SELECT COUNT(schema_url) 
        FROM user_xml_schemas  
        WHERE schema_url = 'file_name_';
    
     BEGIN
    
        OPEN get_data;
        FETCH get_data INTO schema_; 
        CLOSE get_data;
    
        OPEN check_register;
        FETCH check_register INTO registered_;
        CLOSE check_register;
    
        IF registered_ = 0 THEN
           DBMS_XMLSCHEMA.registerSchema(schemaurl       => file_name_, 
                                         schemadoc       => schema_,
                                         local           => TRUE,
                                         gentypes        => FALSE,
                                         gentables       => FALSE,
                                         enablehierarchy => 
        DBMS_XMLSCHEMA.enable_hierarchy_none);   
        END IF;
    
        OPEN get_file_ ;
        FETCH get_file_ INTO data_;
        CLOSE get_file_ ;
    
        xml_ := xmltype(data_, file_name_);
    
        SELECT XMLISVALID(xmltype(data_), file_name_) AS is_valid 
        INTO valid_ 
        FROM dual;
    
        IF valid_ = 0 THEN
           dbms_output.put_line('In Valid');
        ELSE
           dbms_output.put_line('Valid');
        END IF;   
     END;