在 xml 标签之间以不显眼的方式替换非 ascii 字符

Replacing non-ascii character character non-obtrusively between xml tags

我有一个以下格式的 XML 字符串,我需要在按如下方式解析它之前对其进行整理,否则它会失败并显示错误“输入不是正确的 UTF-8;指示编码”:

my $xml_parsed_mess = XML::LibXML->new() -> parse_string($xml_mess);

字符串如下:

my $xml_mess = "<?xml version="1.0" encoding="UTF-8"?><message><tag1>இந்தியாtest123</tag1><tag2>网络test网络</tag2><tag3>i am clean</tag3><tag4>do not worry about me</tag4></message></xml>"

我不想将整个字符串转换为 UTF-8,但我想做的是清理字符串中的特定标签,例如在本例中:

<tag1>இந்தியாtest123</tag1> -> <tag1>test123</tag1>

我知道执行此操作的命令是:

$xml_mess =~ s/[[:^ascii:]]+/ /g;

但是如何定位<tag1>???</tag1>, <tag2>????</tag2>.

等特定字段的内容

我知道我可以更改内容如下:

$xml_mess =~ s|<tag1>test</tag1>|<tag1>testing</tag1>

但是我如何 运行 这个命令针对标签 $xml_mess =~ s/[[:^ascii:]]+/ /g; 的内容而不是替换内容 - 并随后更新 $xml_mess.

use 5.014;
use warnings;

use XML::LibXML qw( );

my $doc = XML::LibXML->new->parse_file("a.xml");

for my $text_node ($doc->findnodes("/message/tag1/text()")) {
   $text_node->setData(
      $text_node->getData() =~ s/[[:^ascii:]]+/ /rg
   );
}

print $doc->toString;
<?xml version="1.0" encoding="UTF-8"?><message><tag1>இந்தியாtest123</tag1><tag2>网络test网络</tag2><tag3>i am clean</tag3><tag4>do not worry about me</tag4></message>

它产生

<?xml version="1.0" encoding="UTF-8"?><message><tag1> test123</tag1><tag2>网络test网络</tag2><tag3>i am clean</tag3><tag4>do not worry about me</tag4></message>