2017-02-13 69 views
1

假設我在一個目錄(和xsd中)有一個xml文件。用PLSQL檢索節點內容

我想知道從這個文件中檢索節點內容的最佳答案。

我可以舉一些做什麼的例子嗎?

讓我們myfile.xml中的這個例子的工作:

<root> 
    <declaration> 
    <id>12</id> 
    </declaration> 
</root> 

比方說,我希望得到12號

TY


  1. 我想獲得更多的比一個節點值。例如,有數百個聲明節點,所以我需要獲得數百個ID

  2. 該文件位於數據庫可以看到的目錄中,這要歸功於目錄對象...創建目錄....

+0

你想提取單個特定節點或幾個值節點? –

+0

文件在哪裏?在客戶端機器上還是在數據庫服務器上?並在數據庫可以看到的目錄中(通過Oracle目錄對象)?你有沒有嘗試過讀取文件? –

回答

0

許多可能性之一。

Legned

XML_DIR - 與特權Oracle對象目錄。

entrypoint.txt - 包含它的特殊文件包含xmlfiles的名稱。文件必須存在於相同的目錄中。該文件必須單獨創建。

xmlDocument1.xml 
xmlDocument2.xml 
etc... 

路徑結構。

XML_DIR -| 
      entrypoint.txt 
      xmlDocument1.xml 
      xmlDocument2.xml 

接下來你必須創建external_table。

CREATE TABLE XML_EXTERNAL_DOCUMENTS (
     FNAME VARCHAR2(100), 
     DOCUMENT CLOB 
    ) 
    ORGANIZATION EXTERNAL (
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY XML_DIR 
    ACCESS PARAMETERS (
     FIELDS (
     FNAME CHAR(100) 
     ) 
     COLUMN TRANSFORMS (
     DOCUMENT FROM lobfile (FNAME) 
     ) 
    ) 
    LOCATION ('entrypoint.txt') 
    ) 
/

現在嘗試查詢外部表,如果一切正確。 如果發生一些異常。可能有錯字錯誤或者你沒有特權。 externatable從entrypoint.txt讀取文件名,並使用它們讀取xml文件。

下一步將clob解析爲xmltype(xmltype(document)),然後用xmltable選擇節點內容。

select src.fname,list.* from XML_external_DOCUMENTS src,xmltable('/root/declaration' passing xmltype(document) columns id number path 'id') list; 
0

這裏有一個簡單的方法來打開一個XML文件,並在PLSQL解析它:使用DBMS.XMLDOM和XMLPROCESSOR的:

DECLARE 
myParser DBMS_XMLPARSER.parser; 
ficContent CLOB; 
emptyContent CLOB := empty_clob(); 
dom DBMS_XMLDOM.DOMDocument; 
rootElement DBMS_XMLDOM.DOMELEMENT; 
rootName VARCHAR2(100); 
myAttribute VARCHAR2(100); 
nlData DBMS_XMLDOM.DOMNODELIST; 
returnCode NUMBER := 0; 

BEGIN 
    myParser := DBMS_XMLPARSER.newParser; 
    ficContent := DBMS_XSLPROCESSOR.Read2Clob('MY_DIR', 'my_file.xml' , '0'); 

    IF ficContent = emptyContent THEN 
     DBMS_OUTPUT.PUT_LINE('file not found'); 
     returnCode := 99; 
    ELSE 
     DBMS_XMLPARSER.parseBuffer(myParser,ficContent); 
     dom := DBMS_XMLPARSER.getDocument(myParser); 
     rootElement := DBMS_XMLDOM.getDocumentElement(dom); 
     rootName := DBMS_XMLDOM.getTagName(rootElement); 

     DBMS_OUTPUT.PUT_LINE('root: ' || rootName); 

     -- get root node attribute 

     myAttribute:= DBMS_XMLDOM.getAttribute(rootElement, 'attribute_name'); 

     -- get nodes value 

     nldata := DBMS_XSLPROCESSOR.selectNodes(DBMS_XMLDOM.makeNode(dom), '//x-path expression', 'xmlns:nsp="http://somewhere.com if there is any namespace"'); 

     FOR i IN 0 .. DBMS_XMLDOM.getLength(nldata) - 1 LOOP 
      nodeValue := DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(DBMS_XMLDOM.Item(nlData, i))); 
     END LOOP; 

    END IF; 

END;