使用PLSQL检索节点内容

时间:2017-02-13 14:19:48

标签: xml oracle plsql

假设我在目录中有一个xml文件(也是xsd)。

我想知道从这个文件中检索节点内容的最简单方法。

我可以举一些例子吗?

让我们使用myfile.xml的这个例子:

<%= @my_hash.as_json %>

假设我想获得12个身份

TY

  1. 我想获得多个节点值。例如,有数百个声明节点,因此我需要获得数百个ID

  2. 该文件位于数据库可以看到的目录中,这要归功于目录对象... create directory ....

2 个答案:

答案 0 :(得分: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')
   )
   /

现在尝试查询外部表,如果一切正确的话。 如果会引发一些例外。可能存在拼写错误或您没有特权。来自entrypoint.txt的外部读取文件名,它使用它们来读取xmlFiles。

下一步将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;

答案 1 :(得分: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;