假设我在目录中有一个xml文件(也是xsd)。
我想知道从这个文件中检索节点内容的最简单方法。
我可以举一些例子吗?
让我们使用myfile.xml的这个例子:
<%= @my_hash.as_json %>
假设我想获得12个身份
TY
我想获得多个节点值。例如,有数百个声明节点,因此我需要获得数百个ID
该文件位于数据库可以看到的目录中,这要归功于目录对象... create directory ....
答案 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;