Pourquoi puis-je obtenir non Valide “prédicat” erreur de getElementsByTagName?
J'ai le code XML suivant:
<config>
<version general="1.2.3">
<subtype type="a" version="1.2" />
<subtype type="b" version="3.6" />
...
</version>
...
</config>
J'ai un code en Perl pour obtenir le nœud config à partir d'une base de données.
Après je reçois, si je tente le suivant:
my $elem = $cfg->getElementsByTagName("version");
my $generalVer = $elem ? $elem->get_node(1)->getAttribute("general") : undef;
tous fonctionne bien, $generalVer
contient 1.2.3
, comme prévu.
Mais si j'essaye ceci:
my $elem = $cfg->getElementsByTagName("version/subtype[@type='a']");
my $aVersion = $elem ? $elem->get_node(1)->getAttribute("version") : undef;
Il échoue avec le message "Invalid prédicat".
Quelqu'un peut aider avec ce problème?
quelle bibliothèque XML utilisez-vous ?
Un petit programme complet montrant le problème serait très utile. Je soupçonne, simplement en regardant ce que vous avez, que 'l'utilisation avertissements vous dire exactement quel est le problème. 🙂
J'utilise XML::LibXML. Doit être mentionné. Désolé.
Un petit programme complet montrant le problème serait très utile. Je soupçonne, simplement en regardant ce que vous avez, que 'l'utilisation avertissements vous dire exactement quel est le problème. 🙂
J'utilise XML::LibXML. Doit être mentionné. Désolé.
OriginalL'auteur Dikla | 2009-12-27
Vous devez vous connecter pour publier un commentaire.
Je soupçonne fortement que
"version/subtype[@type='a']"
n'est pas, en fait, un nom de balise. Qui ressemble à une requête XPath.Je suis en supposant que vous êtes en utilisant quelque chose comme XML::DOM d'analyser ce XML. Si vous souhaitez utiliser XPath, alors vous pouvez utiliser XML::DOM::XPath, ce qui ajoute de la charge de XPath.
Par exemple,
Bon point. Fixe.
OriginalL'auteur friedo
Merci à tous pour les réponses.
Peu de temps après j'ai posé la question, quelqu'un a répondu que le problème était le seul devis et si je vais utiliser des guillemets que cela fonctionnerait. c'est à dire
@type=
"a
" au lieu de@type=
'a
'.Bien, en effet, résolu. Mais quand j'ai essayé de marquer sa réponse que la réponse correcte je trouve qu'il l'a supprimé.
Donc je poste la réponse moi-même, juste pour le record.
Le code suivant fonctionne très bien:
Grâce.
OriginalL'auteur Dikla
La
getElementsByTagName
méthode attend un nom, je ne pense pas qu'il supporte XPath. Utiliser des requêtes XPath, vous devez utiliser un module XML::XPath au lieu de XML::DOM.Voici un exemple d'utilisation de XML::XPath:
Note que vous avez pour échapper à la
@
danssubtype[\@type='a'
, sinon Perl seront à la recherche d'un tableau appelé@type
.OriginalL'auteur Andomar
Vous devez utiliser XPath pour choisir votre élément avec un chemin d'accès ou le faire en deux étapes. getElementsByTagName() ne peut gérer que les noms de balise - pas de chemins d'accès à des éléments. XPath est préféré lorsque vous ne conditionnelle sélectionne (qui vous êtes avec "@type='a'").
OriginalL'auteur Björn