मुझे एक्सएमएल में मूल्य अपडेट करना होगा:

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
                  xmlns:o="urn:schemas-microsoft-com:office:office" 
                  xmlns:x="urn:schemas-microsoft-com:office:excel" 
                  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
                  xmlns:html="http://www.w3.org/TR/REC-html40">
            <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
                <Author>XXXXXX</Author>
                <LastAuthor>UCB User</LastAuthor>
                <Created>2019-10-31T13:04:09Z</Created>
                <Version>14.00</Version>
            </DocumentProperties>
            <a>5</a>
        </Workbook>

मेरे मामले में यह XML तालिका tt फ़ील्ड xml_val में है।

लक्ष्य XPath /कार्यपुस्तिका/दस्तावेज़प्रॉपर्टीज/निर्मित है जिसका मान 2019-10-31T13:04:09Z है और इसे 2020-01-08 से बदला जाना है उन्हें>.

मैंने इस कोड को बांध दिया:

select UPDATEXML(xml_val,
   '/Workbook/DocumentProperties/Created/text()','2020-01-08',
    'xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
              xmlns:o="urn:schemas-microsoft-com:office:office" 
              xmlns:x="urn:schemas-microsoft-com:office:excel" 
              xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
              xmlns:html="http://www.w3.org/TR/REC-html40"').getClobVal() as last
from tt;

//.getClobVal() अंत में है क्योंकि ORA-21500: आंतरिक त्रुटि कोड, तर्क: [%s], [%s], [%s], [%s], [%s], [ %s], [%s], [%s] (यहां)

उपरोक्त कोड कुछ भी नहीं बदलता है। मुझे यह बात इसलिए है क्योंकि DocumentProperties टैग में एक और नेमस्पेस घोषित किया गया है। लेकिन मुझे नहीं पता कि UPDATEXML खंड।

जब मैंने इस कोड के साथ /Workbook/a में मान अपडेट करने का प्रयास किया, तो यह सही काम करता है:

select UPDATEXML(xml_val,
   '/Workbook/a/text()',2020-01-08,
    'xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
              xmlns:o="urn:schemas-microsoft-com:office:office" 
              xmlns:x="urn:schemas-microsoft-com:office:excel" 
              xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
              xmlns:html="http://www.w3.org/TR/REC-html40"').getClobVal() as last
from tt;

मैंने कोशिश की और काम नहीं करने वाले विभिन्न नामस्थान संयोजन:

-1

xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40"

--2

xmlns="urn:schemas-microsoft-com:office:office"
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40"

--3

xmlns="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40"

--4

xmlns="urn:schemas-microsoft-com:office:office"

नोट: मैं DocumentProperties टैग में नेमस्पेस घोषणा को नहीं हटा सकता क्योंकि यह XML Excel-XML प्रारूप फ़ाइल

1
Morticia A. Addams 8 जिंदा 2020, 14:46

1 उत्तर

सबसे बढ़िया उत्तर

DocumentProperties तत्व और उसके बच्चे नाम स्थान में हैं urn:schemas-microsoft-com:office:office जिसका शॉर्टकट o है; आपको उन तत्वों को Xpath में उनके नामस्थान के साथ उपसर्ग करने की आवश्यकता है:

SELECT UPDATEXML(
         xml_val,
         '/Workbook/o:DocumentProperties/o:Created/text()',
         '2020-01-08',
         'xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
          xmlns:o="urn:schemas-microsoft-com:office:office" 
          xmlns:x="urn:schemas-microsoft-com:office:excel" 
          xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
          xmlns:html="http://www.w3.org/TR/REC-html40"'
       ) AS updated_xml
FROM   tt;
| UPDATED_XML                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"><DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"><Author>XXXXXX</Author><LastAuthor>UCB User</LastAuthor><Created>2020-01-08</Created><Version>14.00</Version></DocumentProperties><a>5</a></Workbook> |

db<>fiddle यहां

हालांकि, UPDATEXML पदावनत है और आपको XMLQUERY का उपयोग करना चाहिए:

SELECT XMLQuery(
         'declare default element namespace "urn:schemas-microsoft-com:office:spreadsheet"; (: :)
          declare namespace o = "urn:schemas-microsoft-com:office:office"; (: :)
          copy $i := $x modify 
          ( for $j in $i/Workbook/o:DocumentProperties/o:Created
            return replace value of node $j with $v )
          return $i'
         PASSING xml_val AS "x",
                 '2020-01-08' AS "v"
         RETURNING CONTENT
       ) AS updated_xml
FROM   tt

db<>fiddle यहां

1
MT0 8 जिंदा 2020, 13:27