2 votes

Problème d'analyse avec l'attribut xml : namespace avec Perl LibXML

J'essaie d'analyser un fichier XML dont le contenu est le suivant :

<?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>

Le code perl que j'utilise pour analyser ces données ressemble à ceci (en fait, il s'agit d'une version réduite de la partie principale du code) :

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");
}

J'utilisais auparavant LibXML V1.58. Je fais maintenant des tests avec LibXML V1.70 et j'ai constaté que le résultat est différent :

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?

La V1.70 ne trouve l'attribut que si j'utilise $LANG="xml:lang".

Quelqu'un peut-il expliquer pourquoi LibXML V1.70 traite mon XML différemment ? Puis-je modifier mon code pour qu'il se comporte de la même manière avec la V1.58 et la V1.70 ? Je ne peux pas modifier le document XML.

3voto

ikegami Points 133140

Je soupçonne que cela a plus à voir avec la version de la bibliothèque libxml2 sous-jacente, mais le comportement a changé parce qu'il donnait la mauvaise réponse. (L'élément n'a pas d'attribut nommé lang dans l'espace de nom nul).

L'appel approprié (tel que défini aquí ) est

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

Je n'ai pas les moyens de tester si cela fonctionne dans vos deux environnements. Si ce n'est pas le cas, vous pouvez toujours rendre le code conditionnel sur

$XML::LibXML::VERSION         # Version of XML::LibXML (e.g. 1.70)

ou

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X