使用PL SQL根据XSD验证XML

使用PL SQL根据XSD验证XML,xml,oracle,validation,plsql,xsd,Xml,Oracle,Validation,Plsql,Xsd,我正在尝试这个项目,我有一个Oracle数据库,在其中我将XML和XSD存储在单独的表中。这两个表都有一个包含文档的xmltype列(我正在使用Oracle11gXe和XMLDB) 其思想是让一个函数根据函数中的一个模式验证一个XML,并根据验证结果返回true或false,但我不知道如何实现这一点 我一直在做一些研究,但没有取得多大成功,因为所有的解释都假设模式位于本地文件系统中,而不是数据库中的表中。另外,在解释XMLIsValid函数时,他们谈到了一个XML实例,我不确定我是否理解他们的意

我正在尝试这个项目,我有一个Oracle数据库,在其中我将XML和XSD存储在单独的表中。这两个表都有一个包含文档的xmltype列(我正在使用Oracle11gXe和XMLDB)

其思想是让一个函数根据函数中的一个模式验证一个XML,并根据验证结果返回true或false,但我不知道如何实现这一点

我一直在做一些研究,但没有取得多大成功,因为所有的解释都假设模式位于本地文件系统中,而不是数据库中的表中。另外,在解释XMLIsValid函数时,他们谈到了一个XML实例,我不确定我是否理解他们的意思或如何实现它(我刚刚开始学习PL-SQL,我对使用它一点信心都没有)

目前,XML和模式都是来自W3schools的非常简单的示例,因为文档的内容对于我来说并不像了解如何进行验证那样重要


有人能给我举个例子说明如何做到这一点吗?此外,任何线索都会对我有所帮助。

您可以使用以下示例:

  • 您需要注册架构

  • 您需要同时获取文件和模式

  • 使用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;