使用Perl LibXML解析xml:namespace属性的问题

时间:2012-09-07 15:04:45

标签: xml perl

我正在尝试使用以下内容解析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”,则只能找到该属性。

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

1 个答案:

答案 0 :(得分:3)

我怀疑它与底层libxml2库的版本有更多关系,但行为发生了变化,因为它曾经给出了错误的答案。 (该元素在null命名空间中没有名为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)