在MySQL中存在多个匹配项时更新XML节点

时间:2017-12-08 05:49:47

标签: mysql xml updatexml

我需要从XML中删除节点。

我尝试使用UpdateXML函数。

例如删除节点C:

SELECT UpdateXML('<A><B>b_value<C>c_value1</C></B></A>', '/A/B/C', '')

结果:

'<A><B>b_value</B></A>'

但是当在XML中有多个匹配时,函数返回原始的xml:

SELECT UpdateXML('<A><B>b_value<C>c_value1</C><C>c_value2</C></B></A>', '/A/B/C', '') 

结果:

'<A><B>b_value<C>c_value1</C><C>c_value2</C></B></A>'

但我需要得到这样的结果:

'<A><B>b_value</B></A>'

如果有多个匹配项,我如何删除所有节点。

1 个答案:

答案 0 :(得分:1)

  

12.11 XML Functions :: UpdateXML

     

...

     

如果找不到匹配xpath_expr的表达式,或者多个匹配   找到后,该函数返回原始的xml_target XML片段。 ...

     

...

可能的解决方法是使用存储过程:

DELIMITER //

CREATE PROCEDURE `sp_update_xml`(
  `xml` TEXT,
  `path` TEXT
)
BEGIN
  DECLARE `current_item` BIGINT UNSIGNED
    DEFAULT ExtractValue(`xml`,
                         CONCAT('COUNT(', `path`, ')')
                        );
  WHILE `current_item` > 0 DO
    SET `xml` := UpdateXML(`xml`,
                           CONCAT(`path`, '[', `current_item`, ']'),
                           ''
                          ),
        `current_item` := `current_item` - 1;
  END WHILE;
  SELECT `xml`;
END//

DELIMITER ;

CALL `sp_update_xml`(@`xml`, '/A/B/C');

请参阅db-fiddle