gpt4 book ai didi

xml - 如何将 Perl 的 XML::XPath 与非英文元素名称一起使用?

转载 作者:数据小太阳 更新时间:2023-10-29 02:02:46 24 4
gpt4 key购买 nike

我如何使用 XML::XPath当某些元素的名称不是英文时?

我使用 Strawberry Perl。

我从网络上获取了 employees.xmltrain_xml.pl,它们运行良好。

但是当我添加一些汉字时,出现如下错误:

Wide character in die at D:/Strawberry/perl/site/lib/XML/XPath/Parser.pm line 189.

Query:
/employees/employee[@age="30"]/工作...
..............................^^^
Invalid query somewhere around here (I think)

我该如何解决这个问题?

employees.xml:

<?xml version="1.0" encoding="utf-8" ?>
<employees>
<employee age="30">
<name>linux</name>
<country>US</country>
<工作>教师</工作>
</employee>
<employee age="10">
<name>mac</name>
<country>US</country>
</employee>
<employee age="20">
<name>windows</name>
<country>US</country>
</employee>
</employees>

train_xml.pl:

use Encode;
use XML::XPath->new;
use utf8;
my $xp=XML::XPath->new(filename=>"employees.xml");
print $xp->findvalue('/employees/employee[@age="10"]/name'),"\n";
my $path1 = '/employees/employee[@age="30"]/工作';
print $xp->findvalue($path1),"\n";

最佳答案

你可以使用 XML::LibXML :

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use open ':std', ':encoding(UTF-8)';

use feature qw( say );

use XML::LibXML qw( );

{
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($ARGV[0]);
say $doc->findvalue('/employees/employee[@age="10"]/name');
say $doc->findvalue('/employees/employee[@age="30"]/工作');
}

输出:

$ ./a a.xml
mac
教师

如果您想继续使用(有缺陷、速度较慢且使用范围较远)XML::XPath ,您可以使用以下内容:

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use open ':std', ':encoding(UTF-8)';

use feature qw( say );

use XML::XPath qw( );

{ # Monkeypatch XML::XPath.
package XML::XPath::Parser;

# Colon removed from these definitions.
my $NameStartCharClassBody = "a-zA-Z_\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}";
my $NameCharClassBody = "${NameStartCharClassBody}\\-.0-9\\xB7\\x{300}-\\x{36F}\\x{203F}-\\x{2040}";
my $Name = "(?:[$NameStartCharClassBody][$NameCharClassBody]*)";

$NCName = $Name;
$QName = "$NCName(?::$NCName)?";
$NCWild = "${NCName}:\\*";
}

{
my $doc = XML::XPath->new(filename => $ARGV[0]);
say $doc->findvalue('/employees/employee[@age="10"]/name');
say $doc->findvalue('/employees/employee[@age="30"]/工作');
}

输出:

$ ./a a.xml
mac
教师

关于xml - 如何将 Perl 的 XML::XPath 与非英文元素名称一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45307294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com