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

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

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

我可以举一些例子吗?

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

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

假设我想获得 12 个 id

ty


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

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

【问题讨论】:

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

标签: xml oracle plsql


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多