2017-07-25 151 views
2

有对象:在XMLSCHEMA创建父节点

create or replace type test.type_numberlist as table of number; 
/

create or replace type test.type_test as object (
    LIST test.type_numberlist 
    , OBJ1 number 
    , OBJ2 number 
) 
/

创建简单的XML模式:

BEGIN DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'testschema.xsd', 
    SCHEMADOC => '<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xdb="http://xmlns.oracle.com/xdb" 
      xsi:schemaLocation="http://xmlns.oracle.com/xdb http://xmlns.oracle.com/xdb/XDBSchema.xsd"> 
    <xsd:element name="document" type="TYPE_TESTType" xdb:SQLType="TYPE_TEST" xdb:SQLSchema="TEST"/> 
    <xsd:complexType name="TYPE_TESTType" xdb:SQLType="TYPE_TEST" xdb:SQLSchema="TEST" xdb:maintainDOM="false"> 
    <xsd:sequence> 
    <xsd:element name="LIST" type="xsd:double" maxOccurs="unbounded" minOccurs="0" xdb:SQLName="LIST" xdb:SQLCollType="TYPE_NUMBERLIST" xdb:SQLType="NUMBER" xdb:SQLCollSchema="TEST"/> 
    <xsd:element name="OBJ1" type="xsd:double" xdb:SQLName="OBJ1" xdb:SQLType="NUMBER"/> 
    <xsd:element name="OBJ2" type="xsd:double" xdb:SQLName="OBJ2" xdb:SQLType="NUMBER"/> 
    </xsd:sequence> 
</xsd:complexType> 
</xsd:schema>', 
    LOCAL  => FALSE, 
    GENTYPES => FALSE, 
    OWNER  => 'TEST'); 
END; 
/

测试生成XML的对象:

declare 
    i test.type_test := new test.type_test(LIST => test.type_numberlist(1,2) 
             ,OBJ1 => 1 
             ,OBJ2 => 2); 
    v_xml xmltype; 
begin 
    v_xml := xmltype(xmlData => i 
        , schema => 'TESTSCHEMA.xsd' 
        , element => 'document' 
        , validated => 1); 
    dbms_output.put_line(v_xml.getstringval()); 
end; 

得到这个XML:

<document> 
    <LIST>1</LIST> 
    <LIST>2</LIST> 
    <OBJ1>1</OBJ1> 
    <OBJ2>2</OBJ2> 
</document> 

LIST与OBJ1,OBJ2处于同一级别。有没有什么办法改变XMLSCHEMA创建父节点列表来创建XML,如:

<document> 
    <LIST> 
    <value>1</value> 
    <value>2</value> 
    </LIST> 
    <OBJ1>1</OBJ1> 
    <OBJ2>2</OBJ2> 
</document> 

回答

0

创建一个新的名为complexTypeLISTType

<xsd:complexType name="LISTType" xdb:maintainDOM="false" xdb:SQLType="TYPE_NUMBERLIST" > 
    <xsd:sequence> 
     <xsd:element name="VALUE" type="xsd:double" maxOccurs="unbounded" minOccurs="0" xdb:SQLType="NUMBER"/> 
    </xsd:sequence> 
</xsd:complexType> 
<xsd:element name="document" type="TYPE_TESTType" xdb:SQLType="TYPE_TEST" xdb:SQLSchema="TEST"/> 
<xsd:complexType name="TYPE_TESTType" xdb:SQLType="TYPE_TEST" xdb:SQLSchema="TEST" xdb:maintainDOM="false"> 
    <xsd:sequence> 
     <xsd:element name="LIST" xdb:SQLCollType="TYPE_NUMBERLIST" xdb:SQLCollSchema="TEST"/> 
     <xsd:element name="OBJ1" type="xsd:double" xdb:SQLName="OBJ1" xdb:SQLType="NUMBER"/> 
     <xsd:element name="OBJ2" type="xsd:double" xdb:SQLName="OBJ2" xdb:SQLType="NUMBER"/> 
    </xsd:sequence> 
</xsd:complexType>