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