2016-03-03 67 views
0

我是XML新手,並且想要從具有CLOB列類型的表中加載的XML中提取文本。從放置在Clob字段中的XML中提取來自XML的所有節點的文本Oracle

因爲有葉節點,我不能夠獲得clue.The XML是相當大的,這只是一個片段,如果我可以工作了這一點,我會盡力實現對整個XML。

我有下面的查詢,但我沒有得到

SELECT * 
    FROM XML_T y 
    ,XMLTABLE(XMLNAMESPACES('all the name spaces'), 
        '//e:DocumentServiceID' 
        --/e:DocumentHeader/e:DocumentServiceID' 
         PASSING XMLTYPE.createxml(y.xmlty) 
         COLUMNS service_id varchar2(200) path '@DocumentServiceID' 
           /* factext varchar2(100) path '@FacText', 
           fac varchar2(100) path '@Fac', 
           st_name varchar2(100) path './StreetName', 
           zipcode varchar2(10) path './PostalCode', 
          */ 
); 

我已經把下面的成表服務ID的任何值

<?XML VERSION="1.0" encoding="UTF-8"?> 
<E:EnDatDoc xmlns:ext="http://qbc.net/de/City/A-Ex/1.0" xmlns:df="http://xyz.ht.net/yy/Asset/1.0" xmlns:nc="http://pol.org/ni-core/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:E="http://www.yup.net/enterprise"> 
    <E:DocumentHeader> 
    <E:DocumentServiceID>A_PUSH</E:DocumentServiceID> 
    </E:DocumentHeader> 
     <E:DocumentBody> 
      <df:PropertyRecord> 
        <ext:Facility> 
           <nc:FacText>A9</nc:FacText> 
           <ext:Fac>One St</ext:Fac> 
           <nc:Facility> 
            <nc:LocationAddress> 
             <nc:Addr> 
              <nc:Street> 
               <nc:StreetName>18 STR</nc:StreetName> 
              </nc:Street> 
             <nc:PostalCode>07854</nc:PostalCode> 
             </nc:Addr> 
            </nc:LocationAddress> 
           </nc:Facility> 
          <ext:Item> 
           <nc:MeasureText>40.99</nc:MeasureText> 
           <nc:length>SF</nc:length> 
          </ext:Item> 
          <ext:Gross> 
           <nc:MeasureText>90.00</nc:MeasureText> 
           <nc:Length>SF</nc:Length> 
          </ext:Gross> 
          <nc:ItemWidth> 
           <nc:MeasureText>24.83</nc:MeasureText> 
           <nc:length>FT</nc:length> 
          </nc:ItemWidth> 
          <ext:Irregular>FALSE</ext:Irregular> 
          <ext:Floors>1</ext:Floors> 
         <ext:Cons> 
          <nc:StartDate> 
           <nc:YEAR>1977</nc:YEAR> 
          </nc:StartDate> 
         </ext:Cons> 
         <ext:Conflg>TRUE</ext:Conflg> 
         <ext:Tax> 
          <ext:Classtext>1</ext:Classtext> 
          <ext:Cdesc>1 - 3 Units</ext:Cdesc> 
         </ext:Tax> 
        </ext:Facility> 
      </df:PropertyRecord> 
     </E:DocumentBody> 
    </E:EnDatDoc> 
+0

這不是一個代碼寫入服務,您需要研究Oracle的XML函數並嘗試編寫查詢,而不是要求某人爲您完成這項工作。您還沒有顯示您想要提取的內容或您期望的輸出內容。 –

+0

@AlexPoole我有一個示例查詢,我讀了一些文件,並找出了,但我仍然沒有得到輸出的服務id.I已編輯的問題,並把查詢那裏 –

+0

@AlexPoole我想提取所有文本因此,我必須爲每個文本值創建映射並將其分配給列 –

回答

1

你需要給的完整路徑您要提取的每個(葉)節點相對於XPath標識的節點。您還需要引用元素,而不是屬性(使用您使用的@語法)。

select x.* 
from xml_t y 
cross join xmltable(
    xmlnamespaces('http://qbc.net/de/City/A-Ex/1.0' as "ext", 
    'http://xyz.ht.net/yy/Asset/1.0' as "df", 
    'http://pol.org/ni-core/2.0' as "nc", 
    'http://www.yup.net/enterprise' as "E"), 
    '/E:EnDatDoc' 
    passing xmltype.createxml(y.xmlty) 
    columns service_id varchar2(10) path 'E:DocumentHeader/E:DocumentServiceID', 
    factext varchar2(10) path 'E:DocumentBody/df:PropertyRecord/ext:Facility/nc:FacText', 
    fac varchar2(10) path 'E:DocumentBody/df:PropertyRecord/ext:Facility/ext:Fac', 
    st_name varchar2(10) path 'E:DocumentBody/df:PropertyRecord/ext:Facility/nc:Facility/nc:LocationAddress/nc:Addr/nc:Street/nc:StreetName', 
    zipcode varchar2(10) path 'E:DocumentBody/df:PropertyRecord/ext:Facility/nc:Facility/nc:LocationAddress/nc:Addr/nc:PostalCode' 
) x; 

SERVICE_ID FACTEXT FAC  ST_NAME ZIPCODE 
---------- ---------- ---------- ---------- ---------- 
A_PUSH  A9   One St  18 STR  07854  

然後將其擴展爲您想要提取的所有其他節點/列。

可能作弊和使用通配符的命名空間和路徑:

select x.* 
from xml_t y 
cross join xmltable(
    '/' 
    passing xmltype.createxml(y.xmlty) 
    columns service_id varchar2(10) path '//*:DocumentServiceID', 
    factext varchar2(10) path '//*:FacText', 
    fac varchar2(10) path '//*:Fac', 
    st_name varchar2(10) path '//*:StreetName', 
    zipcode varchar2(10) path '//*:PostalCode' 
) x; 

,但你可能有命名空間衝突,這將導致問題或在某一點突破,以及(如你ext:Facilitync:Facility做),除非這是一個特別的一次性查詢,它會更好地顯式和自我記錄。您和任何閱讀查詢的人都可以看到您希望得到的每一點信息來自哪裏。

您還可以通過構建具有所有想要的信息屬性的新元素來使XPath將結構扁平化,但這可能更困難,也更不明確。

+0

查詢運行正常,但沒有給出行:-(我會再次檢查是否有任何遺漏或大寫。我會盡快更新。非常感謝。也許我錯過了一些XML相關的文件或包上11.2數據庫 –

+0

@RajA - 我在11.2.0.4上用你的示例XML運行了這個程序;用<?XML VERSION'部分變成了小寫,因爲大寫字母是無效的,如果你有什麼遺漏的話就會出錯,所以,也許你的真實結構是不一樣的,或者你改變了一些事情 –

+0

是的我認爲我的結局是錯誤的,我會清理並重新做完整件事情。你是真正的天才,現在我有了更多的信心和渴望, XML stuff.I'll完成剩餘的100+映射並運行,你可以成爲一個非常好的導師!將讓你知道它是怎麼產生的 –

相關問題