这是xml文件:
<ns2:root ns2="http://www.somewhere.com" id="45">
<sending>
.....
</sending>
<declaration>
<summary>
....
</summary>
<content>
<state>OK</state>
<numbers>
<number>12566</number>
</numbers>
<identification>
<data>mydata1</data>
<dat>mydat1</dat>
</identification>
<identification>
<data>mydata2</data>
<dat>mydat2</dat>
</identification>
</content>
<declaration>
</ns2:root>
我收取文件并获得dom,一切都很好。 我试图获取数据节点。
首先,像这样:
nlDataNodes := DBMS_XSLPROCESSOR.selectNodes(DBMS_XMLDOM.makeNode(dom),
'//' || rootName || '/declaration/content/identification/data';
我有一个xml解析错误,说明此节点无效:
ns2:root/declaration/content/identification/data
所以我改变了这样:
nlDataNodes := DBMS_XSLPROCESSOR.selectNodes(DBMS_XMLDOM.makeNode(dom),
'//root/declaration/content/identification/data';
不再有解析错误,但nlDataNodes(DBMS_XMLDOM.DOMNODELIST)为空。
我应该如何获得'数据'节点的lis?
TY
答案 0 :(得分:0)
1)xml中的命名空间decation是错误的.Parser应该引发异常。 <ns2:root ns2="http://www.somewhere.com" id="45">
更改为
<ns2:root xmlns:ns2="http://www.somewhere.com" id="45">
2)函数DBMS_XSLPROCESSOR.selectNodes
有3个属性(第3个是可选的)。在你的例子中,你省略了最后一个。
DBMS_XSLPROCESSOR.selectNodes(DBMS_XMLDOM.makeNode(dom),
'//ns2:root/declaration/content/identification/data','xmlns:ns2="http://www.somewhere.com"');
或使用*(* select any element
)
DBMS_XSLPROCESSOR.selectNodes(DBMS_XMLDOM.makeNode(dom),
'//*/declaration/content/identification/data');
答案 1 :(得分:0)
不应该是:
<ns2:root ns2="http://www.somewhere.com" id="45">
但应该是:
<ns2:root xmlns:ns2="http://www.somewhere.com" id="45">
所以,你可以这样做:
DECLARE
TYPE xml_t IS TABLE OF XMLTYPE;
xml_nodes xml_t;
xml CLOB :=
'<ns2:root ns2="http://www.somewhere.com" id="45">
<sending></sending>
<declaration>
<summary></summary>
<content>
<state>OK</state>
<numbers>
<number>12566</number>
</numbers>
<identification>
<data>mydata1</data>
<dat>mydat1</dat>
</identification>
<identification>
<data>mydata2</data>
<dat>mydat2</dat>
</identification>
</content>
<declaration>
</ns2:root>';
BEGIN
SELECT *
BULK COLLECT INTO xml_nodes
FROM XMLTABLE(
XMLNAMESPACES( 'http://www.somewhere.com' AS "ns2" ),
'//ns2:root/declaration/content/identification/data'
PASSING XMLTYPE( REPLACE( xml, '<ns2:root ns2="', '<ns2:root xmlns:ns2="' ) )
COLUMNS node XMLTYPE PATH '.'
);
FOR i IN 1 .. xml_nodes.COUNT LOOP
DBMS_OUTPUT.PUT_LINE( xml_nodes(i).getStringVal() );
END LOOP;
END;
/