2017-02-13 5 views
1

Предположим, у меня есть xml-файл в каталоге (и xsd тоже).Получить содержимое узлов с помощью PLSQL

Я хотел бы узнать лучший и самый простой способ получить содержимое узла из этого файла.

Могу ли я иметь пример того, что делать?

Давайте работать с этим примером myfile.xml:

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

Допустим, я хочу, чтобы получить 12 ID

ти


  1. Я хочу, чтобы получить больше чем одно значение узла. Есть, например, сотни узлов декларации, поэтому мне нужно получить сотни идентификаторов

  2. Файл находится в каталоге, который может видеть база данных, благодаря объекту directory ... create directory ....

+0

ли Вы хотите, чтобы извлечь значение одного конкретного узла или нескольких узлы? –

+0

Где находится файл - на вашем компьютере-клиенте или на сервере БД; и в каталоге, который может видеть база данных (через объект каталога Oracle)? Вы еще не пытались прочитать файл? –

ответ

0

Одна из многих возможностей.

Legned

XML_DIR - оракул объекта каталога с привилегиями.

entrypoint.txt - специальный файл с ним содержит имена xml-файлов. Файлы должны существовать в одном каталоге. Этот файл нужно создавать отдельно.

xmlDocument1.xml 
xmlDocument2.xml 
etc... 

Путь структуры.

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

Далее вы должны создать внешнюю таблицу.

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') 
    ) 
/

Теперь попробуйте запросить внешнюю таблицу, если все правильно. Если какое-то исключение будет поднято. Вероятно, есть опечатка или у вас нет привилегий. Внешнее имя файла чтения из entrypoint.txt, и оно использует их для чтения xmlFiles.

Следующий шаг parse 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; 
Смежные вопросы