我很难使用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
节点?
答案 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=""
,则会从其父级继承命名空间,因此您的默认工作正常。如果覆盖到无命名空间,则无法使用默认值。