2010-05-12 2 views
0

Предисловие: Это работает в одной базе данных Oracle 11gR1 (Solaris 64), а не на втором, и мы не можем понять разницу между двумя базами данных. Каким-то образом ComplexType вызывает проверку на неудачу с этой ошибкой:dbms_xmlschema не удалось проверить с помощью 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

Решение оказалось восстановить XDB, но при этом, чтобы убедиться, что никакие процессы Oracle не были торчать на сервере, потому что они препятствуют правильному построению XDB и отказу валидатора.

Смежные вопросы