2016-03-03 68 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+映射并运行,你可以成为一个非常好的导师!将让你知道它是怎么产生的 –

相关问题