2017-02-17 2 views
0

Ich habe versucht, Daten aus XML mit Oracle extrahieren. Das ist mein xml:Oracle XML Extract Pfad

<?xml version="1.0" encoding="UTF-8"?> 
<?xfa generator="XFA2_4" APIVersion="3.6.12227.0"?> 
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/"> 
    <config xmlns="http://www.xfa.org/schema/xci/1.0/"> 
     </agent name="designer"> 
     <destination>pdf</destination> 
     <pdf> 
      <fontInfo /> 
     </pdf> 
     </agent> 
     <present> 
     <pdf> 
      <version>1.65</version> 

ich Informationen über die Version extrahieren möchten.

Select XMLTYPE (blob_to_clob(datoteka)).extract('//xdp:xdp/config/present/pdf/version/text()','xmlns:xdp="http://ns.adobe.com/xdp/"').getstringval() AS Verzija from datoteka 

Ich bekomme als Ergebnis null. Ich rate, dass Pfad das Problem verursacht, weil, wenn ich nur "// text()" als Pfad verwende, ich Daten im Ergebnis erhalte. Ich brauche Hilfe, wie ich das beheben kann. Vielen Dank.

Antwort

2

<config xmlns="http://www.xfa.org/schema/xci/1.0/"> Hier ist ein Problem. Der Name des Defaults wurde auf http://www.xfa.org/schema/xci/1.0/" geändert. Der Extrakt muss geändert werden.

extract('//xdp:xdp/config/present/pdf/version/text()','xmlns="http://www.xfa.org/schema/xci/1.0/" xmlns:xdp="http://ns.adobe.com/xdp/"') 
+0

Das war sehr hilfreich. Vielen Dank. – acolak

0

Sie haben auch einen Fehler in der XML Sie auf dem Laufenden (</agent name="designer">).

ist hier ein Arbeitscode

Select XMLTYPE('<?xml version="1.0" encoding="UTF-8"?> 
<?xfa generator="XFA2_4" APIVersion="3.6.12227.0"?> 
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/"> 
    <config xmlns="http://www.xfa.org/schema/xci/1.0/"> 
    <agent name="designer"> 
     <destination>pdf</destination> 
     <pdf> 
     <fontInfo /> 
     </pdf> 
    </agent> 
    <present> 
     <pdf> 
     <version>1.65</version> 
     </pdf> 
    </present> 
    </config> 
</xdp:xdp>').extract('//xdp:xdp/config/present/pdf/version/text()','xmlns="http://www.xfa.org/schema/xci/1.0/" xmlns:xdp="http://ns.adobe.com/xdp/"') 
     .getstringval() AS Verzija 
    from dual 
0

Wie @Arkadiusz bereits erwähnten Sie die Standard-Namespace sowie xdp aufnehmen müssen:

select XMLType(blob_to_clob(datoteka)).extract('/xdp:xdp/config/present/pdf/version/text()', 
    'xmlns:xdp="http://ns.adobe.com/xdp/" xmlns="http://www.xfa.org/schema/xci/1.0/').getstringval() 
    as verzija 
from datoteka; 

VERZIJA 
---------- 
1.65 

(Run gegen modifizierte XML, die Öffnungsmittel fixiert Tag und fügte fehlende schließende Tags hinzu).

Sie können auch einen XMLQuery statt Extrakt verwenden:

select XMLQuery('declare namespace xdp="http://ns.adobe.com/xdp/"; (: :) 
    declare default element namespace "http://www.xfa.org/schema/xci/1.0/"; (: :) 
    /xdp:xdp/config/present/pdf/version/text()' 
    passing XMLType(blob_to_clob(datoteka)) 
    returning content) as verzija 
from datoteka; 

VERZIJA 
---------- 
1.65 

Wenn Ihr XML-Dokument mehrere Versionen haben könnten Sie XMLTable verwenden können, um sie alle zu erhalten:

select x.verzija 
from datoteka d 
cross join xmltable(xmlnamespaces('http://ns.adobe.com/xdp/' as "xdp", 
    default 'http://www.xfa.org/schema/xci/1.0/'), 
    '/xdp:xdp/config/present/pdf' 
    passing XMLType(blob_to_clob(datoteka)) 
    columns verzija path 'version' 
) x; 

VERZIJA 
---------- 
1.65