提取 xmlns 设置为空白的节点

Extracting a node where xmlns is set to blank

我在使用 XMLTABLE 从 XML 结构中的某些节点提取值时遇到困难。当您从 SubListItem 节点中删除 xmlns="" 属性时,下面的查询将完美运行。如您所见,XML 已经有一个默认命名空间。老实说,我不知道如何处理像这样的某些节点上的命名空间 "blanking out"。 为了进一步说明,这个 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 节点?

在第二个 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="" ,那么它会从其父级继承命名空间,因此您的默认设置有效。通过覆盖到无名称空间,您不能使用默认值。