gpt4 book ai didi

xml - xml : namespace attribute with Perl LibXML 的解析问题

转载 作者:行者123 更新时间:2023-12-04 05:33:13 25 4
gpt4 key购买 nike

我正在尝试解析包含以下内容的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<sentences>
<lastmodified>none</lastmodified>
<sentencedefs xml:lang="common">
</sentencedefs>
<sentencedefs xml:lang="en-US">
<baselanguage xml:lang="en-US"/>
</sentencedefs>
</sentences>

我用来解析这个的 perl 代码看起来像这样(实际上这是代码关键部分的缩减版本):
use 5.006_001;
use strict;
use warnings;
use English '-no_match_vars';
use XML::LibXML;

my $SENTENCEDEFS = "sentencedefs";
my $LANG = "lang";

my $lParser = XML::LibXML->new;
my $lSentencesDoc = $lParser->parse_file("sentences.xml");
my $lSentencesRoot = $lSentencesDoc->documentElement();
my @lSentenceDefs = $lSentencesRoot->getElementsByTagName($SENTENCEDEFS);

foreach my $lDefs (@lSentenceDefs)
{
my @lAttrs = $lDefs->attributes();
foreach my $lAttr (@lAttrs)
{
print("Attr: " . $lAttr->toString(1) . "\n");
}

my $lLang = $lDefs->getAttribute($LANG);
my $lFound = defined($lLang);
print("Found $LANG? $lFound \n");
}

我以前一直在使用 LibXML V1.58。我现在正在针对 LibXML V1.70 进行测试,发现输出不同:

V1.58:
Attr:  xml:lang="common"
Found lang? 1
Attr: xml:lang="en-US"
Found lang? 1

V1.70:
Attr:  xml:lang="common"
Found lang?
Attr: xml:lang="en-US"
Found lang?

如果我使用 $LANG="xml:lang",V1.70 只会找到该属性。

谁能解释为什么 LibXML V1.70 以不同的方式处理我的 XML?是否可以对我的代码进行更改以使其在运行 V1.58 和 V1.70 时表现相同?我无法更改 XML 文档。

最佳答案

我怀疑它更多地与底层 libxml2 库的版本有关,但行为改变了,因为它曾经给出错误的答案。 (该元素在空命名空间中没有名为 lang 的属性。)

正确的调用(定义为 here )是

$element->getAttributeNS('http://www.w3.org/XML/1998/namespace', 'lang')

我没有办法测试这是否在您的两个环境中都有效。如果没有,你总是可以让代码以
$XML::LibXML::VERSION         # Version of XML::LibXML (e.g. 1.70)


XML::LibXML::LIBXML_VERSION   # Version of libxml2 (e.g. 20707 for 2.7.7)

关于xml - xml : namespace attribute with Perl LibXML 的解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320700/

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