使用 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 访问内容?