代码之家  ›  专栏  ›  技术社区  ›  Andrew

DBMS_xmlschema无法用complexType验证

  •  0
  • Andrew  · 技术社区  · 14 年前

    前言: 这在一个Oracle11gr1(Solaris64)数据库上工作,而不是在第二个数据库上工作。 我们无法找出这两个数据库之间的区别。complexType导致验证失败,并出现以下错误:

    ORA-31154: invalid XML document
    ORA-19202: Error occurred in XML processing
    LSX-00200: element "shiporder" not empty
    ORA-06512: at "SYS.XMLTYPE", line 354
    ORA-06512: at line 13
    

    但架构有效(通过此联机测试: http://www.xmlme.com/Validator.aspx )

    -- Cleanup any existing schema
    begin
    dbms_xmlschema.deleteschema('shiporder.xsd',dbms_xmlschema.DELETE_CASCADE);
    end;
    
    
    -- Define the problem schema (adapted from http://www.w3schools.com/schema/schema_example.asp)
    begin
    dbms_xmlschema.registerSchema('shiporder.xsd','<?xml version="1.0" encoding="ISO-8859-1" ?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
    <xs:element name="shiporder">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="orderperson" type="xs:string"/>
         </xs:sequence>
      </xs:complexType>
    </xs:element>
    
    
    </xs:schema>',owner=>'SCOTT');
    end;
    
    -- Attempt to validate
    declare
    bbb xmltype;
    begin
    
    bbb := XMLType('<?xml version="1.0" encoding="ISO-8859-1"?>
    
    <shiporder 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="shiporder.xsd">
      <orderperson>John Smith</orderperson>
    </shiporder>');
    
            XMLType.schemaValidate(bbb);
    end;
    

    现在,如果我启动模式定义并在XML中只留下一个字符串,那么验证就通过了:

    begin
    dbms_xmlschema.deleteschema('shiporder.xsd',dbms_xmlschema.DELETE_CASCADE);
    end;
    
    
    begin
    dbms_xmlschema.registerSchema('shiporder.xsd','<?xml version="1.0" encoding="ISO-8859-1" ?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
        <xs:element name="shiporder" type="xs:string"/>
    
    </xs:schema>',owner=>'SCOTT');
    end;
    
    DECLARE
        xml XMLTYPE;
    BEGIN
    
    xml := XMLTYPE('<?xml version="1.0" encoding="ISO-8859-1"?>
    
    <shiporder 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="shiporder.xsd">
      John Smith
    </shiporder>');
    
        XMLTYPE.schemaValidate(xml);
    END;
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Andrew    14 年前

    解决方案原来是重建xdb,但这样做是为了确保服务器上没有挂起任何Oracle进程,因为它们妨碍了xdb的正确构建并导致验证器失败。