提取xmlns设置为空白的节点

时间:2016-02-22 11:12:13

标签: sql xml oracle oracle11g xml-namespaces

我很难使用XMLTABLE从XML结构中的某些节点中提取值。从xmlns=""节点中删除SubListItem属性时,以下查询可以正常工作。正如您所看到的,XML已经具有默认命名空间。老实说,我不知道如何在这样的某些节点上处理命名空间的“消隐”。 为进一步说明,此XML的创建不在我的控制范围内,由第三方提供。我还更改了传递文件中节点和内容的名称,同时保留了XML的结构。

SELECT f.airline, f.flightnumber, fl.gate
  FROM xmltable(
        xmlnamespaces(
                 default 'http://some/name.space',
                 'http://www.w3.org/2001/XMLSchema' as "xsd",
                 'http://www.w3.org/2001/XMLSchema-instance' as "xsi"
                 ),
       'Body/Flight'
        passing xmltype(
'<?xml version="1.0" encoding="utf-16"?>
<Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://some/name.space">
  <Sender>
    <System>ConnectionManagement</System>
  </Sender>
  <Flight>
    <Airline>ABC</Airline>
    <Number>1234</Number>
    <SubList>
      <SubListItem xmlns="">
        <Gate>X</Gate>
      </SubListItem>
      <SubListItem xmlns="">
        <Gate>Y</Gate>
      </SubListItem>
      <SubListItem xmlns="">
        <Gate>Z</Gate>
      </SubListItem>
    </SubList>
  </Flight>
</Body>'
      )
      columns airline varchar2(100) path 'Airline'
     , flightNumber VARCHAR2(5) path 'Number'
     , subList XMLTYPE path 'SubList'
  ) f
, xmltable (
    xmlnamespaces( default 'http://some/name.space'),
    '/SubList/SubListItem'
    passing f.subList
    columns gate varchar2(5) path 'Gate'
  ) fl
;

当XML看起来像这样时,我如何定位Gate节点?

1 个答案:

答案 0 :(得分:1)

在第二个XMLTable中保留默认命名空间,并为您拥有的路径指定命名空间:

...
, xmltable (
    xmlnamespaces( 'http://some/name.space' as "ns"),
    '/ns:SubList/SubListItem'
    passing f.subList
    columns gate varchar2(5) path 'Gate'
  ) fl
;

AIRLINE    FLIGH GATE
---------- ----- -----
ABC        1234  X    
ABC        1234  Y    
ABC        1234  Z    

SubList仍然必须与之匹配,但由于子节点没有,因此默认设置不正确。如果您删除了问题中提到的xmlns="",则会从其父级继承命名空间,因此您的默认工作正常。如果覆盖到无命名空间,则无法使用默认值。