UpdateXML() în MySQL

Înlocuiește în XML elementul găsit cu XPath cu un fragment nou și returnează documentul modificat.

Sintaxă
UpdateXML(xml, xpath, xml_nou)

Ce face UpdateXML()

UpdateXML() caută elementul indicat de expresia XPath și îl înlocuiește în întregime (cu tot cu etichete) cu fragmentul xml_nou. Documentul original nu se modifică; funcția returnează o copie modificată, pe care o poți salva cu UPDATE.

Expresia trebuie să găsească exact un element. Dacă nu găsește niciunul sau găsește mai multe, funcția returnează XML-ul original, neschimbat. Pentru XML invalid returnează NULL.

Parametri

Parametru Descriere
xml Documentul XML.
xpath Expresia XPath pentru elementul înlocuit.
xml_nou Fragmentul pus în locul lui.

Ce returnează

Documentul XML modificat, cel original sau NULL.

Exemple

Exemplul 1: Înlocuirea unui element

SET @xml = '<catalog><produs id="1"><nume>Laptop</nume><pret>3500</pret></produs><produs id="2"><nume>Mouse</nume><pret>80</pret></produs></catalog>';

SELECT UpdateXML(@xml, '/catalog/produs[2]/pret', '<pret>95</pret>') AS modificat;

Rezultat

+------------------------------------------------------------------------------------------------------------------------------------------+
| modificat                                                                                                                                |
+------------------------------------------------------------------------------------------------------------------------------------------+
| <catalog><produs id="1"><nume>Laptop</nume><pret>3500</pret></produs><produs id="2"><nume>Mouse</nume><pret>95</pret></produs></catalog> |
+------------------------------------------------------------------------------------------------------------------------------------------+

Exemplul 2: Niciun element sau mai multe: XML-ul rămâne la fel

SELECT UpdateXML('<a><b>1</b><b>2</b></a>', '/a/b', '<c/>') AS doua_potriviri,
       UpdateXML('<a><b>1</b></a>', '/a/z', '<c/>') AS nicio_potrivire;

Rezultat

+-------------------------+-----------------+
| doua_potriviri          | nicio_potrivire |
+-------------------------+-----------------+
| <a><b>1</b><b>2</b></a> | <a><b>1</b></a> |
+-------------------------+-----------------+

Exemplul 3: Modificarea unei coloane

CREATE TABLE comenzi (id INT, detalii TEXT);
INSERT INTO comenzi VALUES (1, '<comanda><client>Ana</client><stare>nouă</stare></comanda>');

UPDATE comenzi
SET detalii = UpdateXML(detalii, '/comanda/stare', '<stare>livrată</stare>')
WHERE id = 1;

SELECT detalii FROM comenzi;

Rezultat

+----------------------------------------------------------------+
| detalii                                                        |
+----------------------------------------------------------------+
| <comanda><client>Ana</client><stare>livrată</stare></comanda>  |
+----------------------------------------------------------------+

Greșeli frecvente

  • Crezi că modificarea a reușit pentru că nu ai primit eroare. Dacă XPath găsește zero sau mai multe elemente, XML-ul rămâne neschimbat; verifică întâi cu ExtractValue(xml, 'count(...)').
  • Dai ca al treilea argument doar textul ('95'). Elementul întreg este înlocuit, deci pierzi eticheta; scrie '<pret>95</pret>'.

Comenzi înrudite

  • ExtractValue(): Extrage textul dintr-un document XML, folosind o expresie XPath (de exemplu /catalog/produs/nume).
  • REPLACE(): Înlocuiește toate aparițiile unui text cu alt text.
  • JSON_SET(): Setează valori în JSON: le înlocuiește dacă există și le adaugă dacă lipsesc.