次の内容の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ドキュメントを変更できません。