2014-02-18 40 views
2

我正在學習使用Oracle 11g PL/SQL語言生成XML。如何在ORACLE 11g中參照給定的XSD生成XML?

我想根據從db表獲得的數據生成XML,但同時它應該遵循結構並參考我提供的XSD驗證XML。

我已通過dbms_xmlschema.registerSchema註冊了XSD架構,並通過dbms_xmlquery.getXml使用動態腳本生成了XML,然後使用XMLTYPE.schemaValidate對其進行了驗證。

但是在我的過程中,流程首先創建了XML,然後使用XSD對其進行了驗證,所以由此我可能無法獲得正確的結構並需要在生成XML時處理結構。

有沒有什麼辦法可以通過引用我存儲的XSD來生成XML,這樣我就不會錯過結構,並且只有在引用結果有效時纔會創建XML?

+0

Oracle和XML中的XML Schema是一個很大的話題。查看[Oracle XML DB Dev Guide](http://docs.oracle.com/cd/B28359_01/appdev.111/b28369/xdb05sto.htm) – tbone

回答

0

您不能真正基於模式生成xml。 最好的可能是將xml生成到xmltype變量中,然後根據模式對其進行驗證。

您可以使用以下plsql塊(作爲腳本運行)作爲起點。 更改查詢以使用xml函數(XMLFOREST,XMLELEMENT,XMLATTRIBUTES)生成xmltype變量。

一旦你在l_xml裏有了這個,你應該能夠根據你的模式驗證它。 (然後我假設報告錯誤,如果您需要或繼續並根據需要處理xml)

我的示例只是漂亮地打印xml並將其放入dbms輸出中。

set serveroutput on; 
declare 
    l_error varchar2(4094); 
    -- 
    l_xml xmltype; 
    l_tmp varchar2(4096); 
begin 
    dbms_output.put_line('Start'); 

    --generate variable from query 
    select xmlelement("this:root" 
     ,xmlattributes(
     'http://www.w3.org/2001/XMLSchema-instance' as "xmlns:xsi", 
     'http://ic.ac.uk.relationshipvisualiser.app.data.InputData' as "xmlns:this" 
    ) 
     ,xmlelement("this:subelement" 
     ,'subelementValue' 
    ) 
     ,xmlelement("this:subelement2" 
     ,'subelementValue2' 
    ) 
    ) 
    into l_xml 
    from dual; 

    --todo Write code to validate l_xml against xsd schema 

    --now output xml 
    select XMLSERIALIZE(Document l_xml as CLOB INDENT SIZE = 2) 
    into l_tmp 
    from dual; 
    dbms_output.put_line(l_tmp); 


    dbms_output.put_line('End'); 
EXCEPTION WHEN OTHERS THEN 
    l_error := NVL(SUBSTR(SQLERRM,0,990),'NULL'); 
    dbms_output.put_line(l_error || ':-' || NVL(SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE,0,3000),'NULL')); 
end;