如何使用XMLDOM使用xpath表达式获取节点列表

时间:2017-03-02 12:47:26

标签: xml oracle plsql

这是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

2 个答案:

答案 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;
/