2009-03-04 3 views
3

Je veux extraire uniquement les nœuds feuilles d'un objet XMLTYPE dans Oracle 10gComment extraire nœuds feuilles d'Oracle XMLTYPE

SELECT 
    t.getStringVal() AS text 
FROM 
    TABLE(XMLSequence( 
     XMLTYPE(
      '<xml> 
       <node> 
        <one>text</one> 
       </node> 
       <node> 
        <two>text</two> 
       </node> 
       <node> 
        <three>text</three> 
       </node> 
      </xml>' 
     ).extract('//*') 
    )) t 

Que dois-je utiliser comme la clause WHERE donc ce ne retourne que ceux-ci:

    <one>text</one> 
        <two>text</two> 
        <three>text</three> 

J'ai essayé ce qui suit, mais ils ne fonctionnent pas:

WHERE t.existsNode('//*') = 0 
WHERE t.existsNode('/.//*') = 0 
WHERE t.existsNode('.//*') = 0 

Qu'est-ce que je manque?

+0

(+1) grâce cela me aide en dehors :-) – TheChange

Répondre

0

Nevermind je l'ai trouvé:

WHERE 
    t.existsNode('/*//*') = 0 
-1

Vous pouvez essayer le PL/SQL suivante:

DECLARE 
    x XMLType := XMLType(
      '<?xml version="1.0" ?> 
      <xml> 
       <node> 
        <one>text</one> 
       </node> 
       <node> 
        <two>text</two> 
       </node 
       <node> 
        <three>text</three> 
       </node> 
      </xml>'); 
BEGIN 
    FOR r IN (
    SELECT ExtractValue(Value(p),'/XML/node/one/text()') as one_x 
      ,ExtractValue(Value(p),'/XML/node/two/text()') as TWO_x 
      ,ExtractValue(Value(p),'/XML/node/three/text()') as three 
    FROM TABLE(XMLSequence(Extract(x,'/XML/node/'))) p 
    ) LOOP 
    /* do whatever you want with r.one_x, r.TWO_x, r.three_x */ 
    END LOOP; 
END; 
0

Le XPath //*[not(*)] obtiendra un élément au niveau 1 ou plus profond qui n'a pas de enfants:

SQL Fiddle

Requête 1:

SELECT t.getStringVal() 
FROM TABLE(
     XMLSEQUENCE(
      XMLTYPE(
      '<xml> 
      <node><one>text</one></node> 
      <node><two>text</two></node> 
      <node><three>text</three></node> 
      </xml>' 
      ).extract('//*[not(*)]') 
     ) 
     ) t 

Results:

| T.GETSTRINGVAL() | 
|---------------------| 
|  <one>text</one> | 
|  <two>text</two> | 
| <three>text</three> | 

Si vous voulez être en mesure d'inclure l'élément racine puis utilisez le XPath (//*|/*)[not(*)]

Questions connexes