2010-05-10 4 views
1

HI, Je suis en train d'analyser un fichier XML en utilisant LibXML en Perl. Le problème que j'ai est les caractères de fin (espaces) est traité comme un nœud de texte. Par exemple, étant donné une entrée comme suitXML :: Fin de ligne LibXML (espace) Problème

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE books [ 
    <!ELEMENT title (#PCDATA)> 
    <!ELEMENT author (#PCDATA)> 
    <!ELEMENT year (#PCDATA)> 
    <!ELEMENT price (#PCDATA)> 
    <!ELEMENT book (title, author, year, price)> 
    <!ELEMENT books (book*)> 
]> 
<books> 
<book> 
<title>Everyday Italian</title> 
<author>Giada De Laurentiis</author> 
<year>2005</year> 
<price>30.00</price> 
</book> 
</books> 

L'analyseur pense que le nombre d'enfants de noeuds « livres » est 3, ils sont les suivants:

    noeud texte
  • (contenant le charbon entre <books> et <book>)
  • noeud d'élément
  • de <book>
  • noeud de texte
  • (contenant le produit de carbonisation entre </book> et </books>)

Comment puis-je dire à LibXML d'ignorer les espaces? J'ai essayé avec no_blanks (c'est $ parser = XML :: LibXML-> new (no_blanks => 1) lors de la construction de l'analyseur) mais il semble que cela n'a aucun effet.

Merci à l'avance

+0

pour supprimer tout espace blanc à la fin de la ligne. – Space

+0

Malheureusement, je ne peux pas simplement supprimer aveuglément ces espaces de chaque ligne parce que les résultats pourraient ne pas être valables selon la DTD que j'utilise. – Gilbeg

+0

+1 pour Giada De Laurentiis (bien, et j'aime la question :) – DVK

Répondre

2

XML :: LibXML :: Parser a $parser->keep_blanks(0);. Il est censé faire le contraire de no_blanks - voir si cela fonctionne

+0

Merci pour la suggestion, mais cela n'aide pas. Je l'ai essayé sur Linux et Cygwin. – Gilbeg

+0

a travaillé pour moi. si je bascule, les nœuds de texte contenant les CR disparaissent. – kdubs

1

-Strictement parlant, XML::LibXML est en train de faire la bonne chose ... il y a trois nœuds fils de l'élément <books>. La question est, comment analysez-vous le contenu, et pourquoi est-ce un problème?

En supposant que vous avez analysé votre contenu et affecté le résultat à $document, vous avez maintenant une instance de la classe XML::LibXML::Document. Avec cela, vous pouvez obtenir l'élément <books> en utilisant documentElement():

$books = $document->documentElement(); 

Cela renvoie une instance de XML::LibXML::Element. De là, vous pouvez obtenir seulement les éléments enfants-<book> utilisant getChildrenByTagName():

@book_elements = $books->getChildrenByTagName('book'); 

cette aide? Pouvez-vous utiliser "s/\ s + $ //";

+0

Salut, J'ai à peu près fait ce que vous avez mentionné. Dans la version de l'extrait, $ dom = XML :: LibXML-> load_xml (emplacement => "books.xml"); $ dom-> validate(); $ racine = $ dom-> documentElement(); @x = $ root-> childNodes; La taille de @X est 3. Il semble que LibXML est cassé. L'appel validate() Does valide le dom contre la DTD. Je le sais parce que si j'échange l'oder du titre et de l'auther, l'analyseur se plaint. Cependant, l'analyseur a échoué à comprendre de la DTD que l'enfant des livres ne peut être que titre, auteur, année et prix, pas de PCDATA du tout. Alors, d'où vient ce textnode? – Gilbeg

Questions connexes