如何在xml中添加子节点?

时间:2018-02-14 14:04:11

标签: xml oracle plsql

我有以下xml。我想添加22的值。我刚尝试了insertXMLafter;但是,它不起作用。

`

<XML>
    <FRUIT_SHOP>JARVIZ</FRUIT_SHOP>
    <FRUITS>
        <FRUIT>
            <FRUIT_NAME>ORANGE</FRUIT_NAME>
            <ORANGE_FIELDS>
                <FIELD>
                    <KEY>COLOUR</KEY>
                    <VALUE>LIGHT_RED</VALUE>
                </FIELD>
                <FIELD>
                    <KEY>WEIGHT</KEY>
                </FIELD>
            </ORANGE_FIELDS>
        </FRUIT>
    </FRUITS>

`

My expectation is 

    `<XML>
<FRUIT_SHOP>JARVIZ</FRUIT_SHOP>
<FRUITS>
    <FRUIT>
        <FRUIT_NAME>ORANGE</FRUIT_NAME>
        <ORANGE_FIELDS>
            <FIELD>
                <KEY>COLOUR</KEY>
                <VALUE>LIGHT_RED</VALUE>
            </FIELD>
            <FIELD>
                <KEY>WEIGHT</KEY>
                <VALUE>22</VALUE>
            </FIELD>
        </ORANGE_FIELDS>
    </FRUIT>
</FRUITS>

`

请指导我解决这个问题......

2 个答案:

答案 0 :(得分:0)

像以前一样使用INSERTCHILDXMLFIELD[KEY="WEIGHT"]来指示您需要插入的FIELD节点。

WITH t ( old_xml, child_xml, node, field_name) AS
      ( SELECT 
    '<XML>
        <FRUIT_SHOP>JARVIZ</FRUIT_SHOP>
    <FRUITS>
        <FRUIT>
            <FRUIT_NAME>ORANGE</FRUIT_NAME>
            <ORANGE_FIELDS>
                <FIELD>
                    <KEY>COLOUR</KEY>
                    <VALUE>LIGHT_RED</VALUE>
                </FIELD>
                <FIELD>
                    <KEY>WEIGHT</KEY>
                </FIELD>
            </ORANGE_FIELDS>
        </FRUIT>
    </FRUITS>
    </XML>
    ' old_xml,

    '<VALUE>22</VALUE>' child_xml,

      '/XML/FRUITS/FRUIT/ORANGE_FIELDS/FIELD[KEY="WEIGHT"]' node,
               'VALUE' field_name
       FROM dual)
SELECT
  INSERTCHILDXML(XMLTYPE(old_xml),
  node,
  field_name,
  XMLTYPE(child_xml))
FROM t;

答案 1 :(得分:0)

insertXmlAfter从口服11g中剔除。这是一个很好描述如何用new替换旧方法的页面。 https://docs.oracle.com/database/121/ADXDB/app_depr_upd.htm#ADXDB6044

示例:

select xmlserialize(document xmlquery('copy $tmp := $doc modify (
  for $row in $tmp/XML/FRUITS/FRUIT/ORANGE_FIELDS/FIELD
  where not(exists($row/VALUE))
  return insert node    <VALUE>{$value}</VALUE> into $row 
  )
return $tmp'
                passing xmltype('<XML>
    <FRUIT_SHOP>JARVIZ</FRUIT_SHOP>
    <FRUITS>
        <FRUIT>
            <FRUIT_NAME>ORANGE</FRUIT_NAME>
            <ORANGE_FIELDS>
                <FIELD>
                    <KEY>COLOUR</KEY>
                    <VALUE>LIGHT_RED</VALUE>
                </FIELD>
                <FIELD>
                    <KEY>WEIGHT</KEY>
                </FIELD>
            </ORANGE_FIELDS>
        </FRUIT>
    </FRUITS>
    </XML>') as "doc", 'xxxx' as "value" returning content) as clob)
  from dual;

在示例中我使用两个结构CMR(复制/修改/返回)和FLWOR(用于/ let / where / order / return)

相关问题