2

次の内容の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");
}

以前はLibXMLV1.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?

V1.70は、$ LANG = "xml:lang"を使用した場合にのみ属性を検出します。

LibXML V1.70が私のXMLを異なる方法で処理している理由を誰かが説明できますか?V1.58とV1.70の両方で実行したときに同じように動作するように、コードに変更を加えることはできますか?XMLドキュメントを変更できません。

4

1 に答える 1

3

基になるlibxml2ライブラリのバージョンと関係があるのではないかと思いますが、以前は間違った答えを示していたため、動作が変更されました。lang(要素には、null名前空間で指定された属性はありません。)

適切な呼び出し(ここで定義されている)は

$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)
于 2012-09-07T15:16:06.130 に答える