如何引用 XML 标签内包含的特殊字符?

如何引用 XML 标签内包含的特殊字符?

是否可以通过简单的方法替换sed限制在 2 个字符串内的字符串()?

例子

我的xmlfeed 包含许多标签,包括<DESCRIPTION>里面带有特殊字符的标签。

我需要更改特殊字符仅有的在此标签内。我的意思是,<&lt;"&quot;,等等。

来源

    <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>

结果

    <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>

或者有另一种方法来“修复”这个 xml?

谢谢。

更新

它可以工作,但对于大多数 xml 标签来说,甚至对于 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>https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/</URL>
    <IMGURL>https://b2b.utc.cz/bin/product/4/ABF644B.jpg</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>https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-zelena/347057p/</URL>
    <IMGURL>https://b2b.utc.cz/bin/product/4/ABF644G.jpg</IMGURL>
    <IMGURL_ALTERNATIVE></IMGURL_ALTERNATIVE>
...

它应该是。

<?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>https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/</URL>
    <IMGURL>https://b2b.utc.cz/bin/product/4/ABF644B.jpg</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>
...

答案1

尝试一下,你需要安装recode包:

sudo apt install recode

备份原始文件


我目前已经实现了这个目标:

代码:

#!/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

然后:

$ 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>https://b2b.utc.cz/lahev-na-vodu-bisfree-eco-550ml-hneda/347058p/</URL>
    <IMGURL>https://b2b.utc.cz/bin/product/4/ABF644B.jpg</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>

相关内容