How can I quote special characters contained inside XML tags?

is possible by simple way replace string (sed) limited inside 2 strings?

Example

I have xml feed contains many tags, including <DESCRIPTION> tag with special chars inside.

I need change special chars only inside this tag. I mean < to &lt;, " to &quot;, etc.

Source

 <DESCRIPTION><p>Konvice s pokličkou smalt je vhodná ke každodennímu použití. Lze ji mýt v myčce na nádobí a je vhodná pro plynové, elektrické sporáky a indukci. Objem 2 l, v červené barvě s bílým puntíkem.</p><p> </p><p> </p></DESCRIPTION>

Result

 <DESCRIPTION>&lt;p&gt;Konvice s pokličkou smalt je vhodná ke každodennímu použití. Lze ji mýt v myčce na nádobí a je vhodná pro plynové, elektrické sporáky a indukci. Objem 2 l, v červené barvě s bílým puntíkem.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;</DESCRIPTION>

Or is another way to "repair" this xml?

Thank you.

UPDATE

It works, but for most of xml tags, even for xml head. :/

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
<SHOP><GENERATED>2021-02-05T14:15:02+01:00</GENERATED>
<SHOPITEM> <ITEM_ID>ABF644B</ITEM_ID> <PRODUCTNAME>L&Aacute;HEV NA VODU &quot;BISFREE ECO&quot; 550ML, HN&#282;D&Aacute;</PRODUCTNAME> <DESCRIPTION>L&aacute;hev na vodu &quot;Bisfree Eco&quot;. D&iacute;ky barevn&eacute; plastov&eacute; l&aacute;hvi na vodu lock budete m&iacute;t o mno&#382;stv&iacute; vypit&yacute;ch tekutin p&#345;ehled. Mal&aacute; velikost s objemem 550 ml s v&iacute;&#269;kem se toti&#382; vleze do ka&#382;d&eacute; ta&scaron;ky &#269;i kabelky a vodu tak m&#367;&#382;ete m&iacute;t st&aacute;le p&#345;i sob&#283;. L&aacute;hev je vyroben&aacute; z Tritanu - lehk&yacute;, odoln&yacute; proti n&aacute;raz&#367;m a kvalitn&iacute; plast - neobsahuje BPA. Tritan je popul&aacute;rn&iacute; n&aacute;hra&#382;ka skla. Barva hn&#283;d&aacute;. Rozm&#283;ry - 6,5&times;6,5&times;22 cm</DESCRIPTION> <URL> <IMGURL> <IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE> <ORIGINAL_PRICE_VAT>199.00</ORIGINAL_PRICE_VAT> <PURCHASE_PRICE_VAT>164.46</PURCHASE_PRICE_VAT> <MANUFACTURER>LOCKNLOCK</MANUFACTURER> <CATEGORY>STOLOV&Aacute;N&Iacute; | P&#344;&Iacute;PRAVA N&Aacute;POJ&#366; | SPORTOVN&Iacute; LAHVE</CATEGORY> <EAN>8803733138772</EAN> <ITEMGROUP_ID></ITEMGROUP_ID> <PRICE_VAT>199.00</PRICE_VAT>
</SHOPITEM>
<SHOPITEM> <ITEM_ID>ABF644G</ITEM_ID> <PRODUCTNAME>L&Aacute;HEV NA VODU &quot;BISFREE ECO&quot; 550ML, ZELEN&Aacute;</PRODUCTNAME> <DESCRIPTION>L&aacute;hev na vodu &quot;Bisfree Eco&quot;. D&iacute;ky barevn&eacute; plastov&eacute; l&aacute;hvi na vodu lock budete m&iacute;t o mno&#382;stv&iacute; vypit&yacute;ch tekutin p&#345;ehled. Mal&aacute; velikost s objemem 550 ml s v&iacute;&#269;kem se toti&#382; vleze do ka&#382;d&eacute; ta&scaron;ky &#269;i kabelky a vodu tak m&#367;&#382;ete m&iacute;t st&aacute;le p&#345;i sob&#283;. L&aacute;hev je vyroben&aacute; z Tritanu - lehk&yacute;, odoln&yacute; proti n&aacute;raz&#367;m a kvalitn&iacute; plast - neobsahuje BPA. Tritan je popul&aacute;rn&iacute; n&aacute;hra&#382;ka skla. Barva zelen&aacute;. Rozm&#283;ry - 6,5&times;6,5&times;22 cm</DESCRIPTION> <URL> <IMGURL> <IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>
...

It should be.

<?xml version="1.0" encoding="utf-8"?>
<SHOP><GENERATED>2021-02-05T14:19:48+01:00</GENERATED>
<SHOPITEM> <ITEM_ID>ABF644B</ITEM_ID> <PRODUCTNAME>LÁHEV NA VODU "BISFREE ECO" 550ML, HNĚDÁ</PRODUCTNAME> <DESCRIPTION>&lt;p&gt;Konvice s pokličkou smalt je vhodná ke každodennímu použití. Lze ji mýt v myčce na nádobí a je vhodná pro plynové, elektrické sporáky a indukci. Objem 2 l, v červené barvě s bílým puntíkem.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;</DESCRIPTION> <URL> <IMGURL> <IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE> <ORIGINAL_PRICE_VAT>199.00</ORIGINAL_PRICE_VAT> <PURCHASE_PRICE_VAT>164.46</PURCHASE_PRICE_VAT> <MANUFACTURER>LOCKNLOCK</MANUFACTURER> <CATEGORY>STOLOVÁNÍ | PŘÍPRAVA NÁPOJŮ | SPORTOVNÍ LAHVE</CATEGORY> <EAN>8803733138772</EAN> <ITEMGROUP_ID></ITEMGROUP_ID> <PRICE_VAT>199.00</PRICE_VAT>
</SHOPITEM>
...
6

1 Answer

Try this, you need to install the recode package:

sudo apt install recode

Make a backup of the original file.


I have achieved this so far:

The code:

#!/bin/bash
# create a function to parse the files
f() { # get the original text between the tags inside DESCRIPTION decoded="$(sed -n '/<DESCRIPTION>/p;' "$1" | sed 's:<\([^>]*\)>::g' | sed 's/^[[:blank:]]*\|[[:blank:]]*$//g')" # get the encoded text from the decoded text encoded="$(echo "$decoded" | recode ..html | sed 's:&lt;DESCRIPTION&gt;\(.*\)&lt;/DESCRIPTION&gt;:\1:')" # encode everything inside DESCRIPTION to temporal file awk '/DESCRIPTION/{"echo \""$0"\" | recode ..html" | getline $0;}1' "$1" > output.xml # replace the encoded with the decoded [[ ! -z "$encoded" ]] && sed -i "s/$encoded/$decoded/" output.xml # decode DESCRIPTION tags sed "s:&lt;\([^;]*\)DESCRIPTION&gt;:<\1DESCRIPTION>:g" output.xml >> result.xml
}
# create result file
> result.xml
# split the source file into <SHOPITEM> chunks
csplit --suffix-format="%d.FOO" file.xml '/<SHOPITEM>/' '{*}' 2>&1 > /dev/null
# loop over the "chunk" files
for i in *.FOO; do # apply the function to the "chunk" file f "$i" # remove "chunk" file rm "$i"
done
# remove temporal file
rm output.xml

Then:

$ cat result.xml
<?xml version="1.0" encoding="utf-8"?>
<SHOP><GENERATED>2021-02-05T14:19:48+01:00</GENERATED>
<SHOPITEM> <ITEM_ID>ABF644B</ITEM_ID> <PRODUCTNAME>LÁHEV NA VODU "BISFREE ECO" 550ML, HNĚDÁ</PRODUCTNAME> <DESCRIPTION>&lt;p&gt;Konvice s pokličkou smalt je vhodná ke každodennímu použití. Lze ji mýt v myčce na nádobí a je vhodná pro plynové, elektrické sporáky a indukci. Objem 2 l, v červené barvě s bílým puntíkem.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;</DESCRIPTION> <URL> <IMGURL> <IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE> <ORIGINAL_PRICE_VAT>199.00</ORIGINAL_PRICE_VAT> <PURCHASE_PRICE_VAT>164.46</PURCHASE_PRICE_VAT> <MANUFACTURER>LOCKNLOCK</MANUFACTURER> <CATEGORY>STOLOVÁNÍ | PŘÍPRAVA NÁPOJŮ | SPORTOVNÍ LAHVE</CATEGORY> <EAN>8803733138772</EAN> <ITEMGROUP_ID></ITEMGROUP_ID> <PRICE_VAT>199.00</PRICE_VAT>
</SHOPITEM>
10

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like