在 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>
我有一个以下格式的 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>