用0替换空节点的值

时间:2015-07-27 16:29:20

标签: xml oracle xquery

以下是我的示例XML:

<root>
    <item>old_value</item>
    <item/>
<root>

我在XMLTYPE列中有一个包含XML数据的表,到目前为止我设法查询至少有一个空item节点的行,如上所示。

现在,我想用<item>0</item>替换空节点,以便我的XML看起来像:

<root>
    <item>old_value</item>
    <item>0</item>
<root>

我尝试在Oracle论坛上查看herehere,但未找到我可以使用的答案。

2 个答案:

答案 0 :(得分:2)

问题中链接1中的示例仅适用于文档中的一个元素 item 。如果有多个 item 元素,如示例中所示;应该使用稍微修改过的XMLQuery:

 select xmlquery(
            'copy $d := .
             modify (
          for $i in $d/root/item 
          where string-length($i) = 0 
          return replace value of node $i with $val            
             )
            return $d'
            passing xmlparse(document '<root><item>old_value</item><item/><item/></root>')
                  ,'new_value' as "val"
            returning content
         ) as result
 from dual;  


 <root><item>old_value</item><item>new_value</item><item>new_value</item></root>

答案 1 :(得分:1)

create table test_xml(id number, doc xmltype);
insert into test_xml values(1,xmltype('<root><item>old_value</item><item/><item1/><item2/></root>'));
insert into test_xml values(2,xmltype('<root><item>old_value</item><item/><item1/><item2/></root>'));
UPDATE test_xml SET doc =
   UPDATEXML(doc,
   '/root/item[not(text())]',xmltype('<item>0</item>')) where id =1;
---
UPDATE test_xml SET doc =
   appendChildXML(doc,
   '/root/*[not(text())]',xmltype('<any>0</any>').extract('/any/text()'))

首次更新用零项目替换空项目 第二次更新将text-node = 0附加到所有空节点。