如何通过属性值提取/更新Oracle 12g XML中的属性值

时间:2019-07-10 20:28:16

标签: xml attributes extract

您好,我是Oracle XML DB的新手,但必须通过另一个属性值来提取属性值。

简化后的文档如下:

<ApplicationDataNotification>
    <ApplicationData>
        <DataSet Name="A1">
            <Data DataElement="PAND" Value="A100"/>
            <Data DataElement="MKDI" Value="007"/>
        </DataSet>
        <DataSet Name="A2">
            <Data DataElement="PAND" Value="B200"/>
            <Data DataElement="MKDI" Value="900"/>
        </DataSet>
    </ApplicationData>
</ApplicationDataNotification>

如果使用位置表示法则可以使用(返回:A100):

with testTable(xml_val) 
as (  
    select xmltype(  
    '    
        <ApplicationDataNotification>
            <ApplicationData>
                <DataSet Name="A1">
                    <Data DataElement="PAND" Value="A100"/>
                    <Data DataElement="MKDI" Value="007"/>
                </DataSet>
                <DataSet Name="A2">
                  <Data DataElement="PAND" Value="B200"/>
                  <Data DataElement="MKDI" Value="900"/>
                </DataSet>
            </ApplicationData>
        </ApplicationDataNotification>
    ') from dual)  
select xmlcast(xmlquery('/ApplicationDataNotification/ApplicationData/DataSet[1]/Data[1]/@Value' passing xml_val returning content) as varchar2(2000)) as PAN
    from testTable;

但是问题是xml标记的顺序不固定。

因此,我尝试使用这种方法:

with testTable(xml_val) 
as (  
    select xmltype(  
    '    
        <ApplicationDataNotification>
            <ApplicationData>
                <DataSet Name="A1">
                  <Data DataElement="PAND" Value="A100"/>
                  <Data DataElement="MKDI" Value="007"/>
                </DataSet>
                <DataSet Name="A2">
                  <Data DataElement="PAND" Value="B200"/>
                  <Data DataElement="MKDI" Value="900"/>
                </DataSet>
            </ApplicationData>
        </ApplicationDataNotification>
        ') from dual)  
select xmlcast(xmlquery('/ApplicationDataNotification/ApplicationData/DataSet[Name="A1"]/Data[DataElement="PAND"]/@Value' passing xml_val returning content) as varchar2(2000)) as PAN
    from testTable;

它返回null。

对不起,但我感到困惑...请您能提供帮助! 如何重新编写查询以使工作正常? 附注:Oracle 12g

2 个答案:

答案 0 :(得分:0)

对不起,很简单: 省略“ @” 选择xmlcast(xmlquery('/ ApplicationDataNotification / ApplicationData / DataSet [@ Name =“ A1”] / Data [@ DataElement =“ PAND”] / @ Value'通过xml_val返回内容)作为varchar2(2000)作为PAN     从testTable;

答案 1 :(得分:0)

使用FLWOR表达式可能是这样的:

with testTable(xml_val) 
as (  
    select xmltype(  
    '    
        <ApplicationDataNotification>
            <ApplicationData>
                <DataSet Name="A1">
                  <Data DataElement="PAND" Value="A100"/>
                  <Data DataElement="MKDI" Value="007"/>
                </DataSet>
                <DataSet Name="A2">
                  <Data DataElement="PAND" Value="B200"/>
                  <Data DataElement="MKDI" Value="900"/>
                </DataSet>
            </ApplicationData>
        </ApplicationDataNotification>
        ') from dual)  
select xmlquery('for $i in /ApplicationDataNotification/ApplicationData/DataSet
                 let $j := $i/Data[@DataElement = "PAND"]
                 where $i/@Name eq "A1" 
                 return $j/@Value'
                 passing xml_val returning content) colval
  from testTable;