使用 PLSQL 检索节点内容

Posted

技术标签:

【中文标题】使用 PLSQL 检索节点内容【英文标题】:Retrieve nodes content with PLSQL 【发布时间】:2017-02-13 14:19:47 【问题描述】:

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

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

我可以举一些例子吗?

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

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

假设我想获得 12 个 id

ty


    我想获得多个节点值。比如有上百个声明节点,所以我需要获取上百个id

    文件位于数据库可以看到的目录中,这要归功于目录对象...创建目录...。

【问题讨论】:

您要提取单个特定节点还是多个节点的值? 文件在哪里 - 在您的客户端机器上,或在数据库服务器上;并且在数据库可以看到的目录中(通过 Oracle 目录对象)?您是否尝试过读取文件? 【参考方案1】:

多种可能性之一。

有腿

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;

【讨论】:

【参考方案2】:

这是一个简单的方法来打开一个 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;

【讨论】:

以上是关于使用 PLSQL 检索节点内容的主要内容,如果未能解决你的问题,请参考以下文章

Oracle APEX 交互式网格:如何使用 PLSQL 访问内容?

如何使用 PLSQL 打开、读取和存储 XLSX 文件的 DB 内容?

如何探索 PLSQL 块中的 out 游标参数?

plsql developer怎么连接数据库

从 plsql 选择过程中检索值

PLSQL 可以从外部共享文件夹中检索文件吗?