2017-03-02 48 views
0

XPath表達式來獲取節點列表下面是XML文件:如何使用與XMLDOM

<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)爲空。

我應該如何獲得'data'節點的lis?

TY

+0

您可以嘗試打印'root',因爲您收到錯誤'ns2:root/declaration/content/identification/data'。我希望如果你能夠獲得'root'值,那麼你肯定會得到你的xml節點的位置,並且你可以使用'xpath'輕鬆地找到你想要的數據。 –

回答

0

1)命名空間在XML delcation是wrong.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'); 
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; 
/