2009-11-16 5 views
0

J'essaye d'analyser XML en Perl en utilisant XML::SAX parser. Ma requête concerne la création de valeurs d'attributs. En ce moment, je suis en mesure de générer des seules valeurs présentes à l'intérieur des éléments d'étiquette, mais mon objectif est de générer:Perl XML: erreur d'analyse SAX -> Valeur d'attribut non imprimable

Element Name: Element Value: 
    Element Attribute Name: Element Attribute Value: 
    Element Child Name: Element Child Value 
    Element Child Attribute Name: Element Child Attribute Value 

Voici mon books1.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="urn:books" 
      xmlns:bks="urn:books"> 

    <xsd:element name="books" type="bks:BooksForm"/> 

    <xsd:complexType name="BooksForm"> 
    <xsd:sequence> 
     <xsd:element name="book" 
        type="bks:BookForm" 
        minOccurs="0" 
        maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="BookForm"> 
    <xsd:sequence> 
     <xsd:element name="author" type="xsd:string"/> 
     <xsd:element name="title" type="xsd:string"/> 
     <xsd:element name="genre" type="xsd:string"/> 
     <xsd:element name="price" type="xsd:float" /> 
     <xsd:element name="pub_date" type="xsd:date" /> 
     <xsd:element name="review" type="xsd:string"/> 
    </xsd:sequence> 
    <xsd:attribute name="id"  type="xsd:string"/> 
    </xsd:complexType> 
</xsd:schema> 

Voici mon exemple Books.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!--Sample XML file generated by XMLSpy v2009 sp1 (http://www.altova.com)--> 
<bks:books xsi:schemaLocation="urn:books Untitled1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bks="urn:books"> 
     <book id="String"> 
       <author>String</author> 
       <title>String</title> 
       <genre>String</genre> 
       <price>3.14159E0</price> 
       <pub_date>1967-08-13</pub_date> 
       <review>String</review> 
     </book> 
</bks:books> 

Voici mon parser.pl fichier:

#!usr/bin/perl -w 

use XML::SAX::ParserFactory; 
use MyHandler; 

my $handler = MyHandler->new(); 
my $parser = XML::SAX::ParserFactory->parser(Handler => $handler); 
$parser->parse_uri("books1.xml") 

Voici mon module MyHandler.pm:

package MyHandler; 

use base qw(XML::SAX::Base); 

my $in_books = 0; 

sub start_element { 
     my ($self,$data) = @_; 
     if($data->{Name} eq 'bks:books'){ 
      $in_books++; 

     } 
} 

sub end_element { 
     my($self,$data) = @_; 
     if($data->{Name} eq 'bks:books){ 
       $in_books--; 
       print "\n"; 
     } 
} 

sub characters{ 
     my($self,$data) = @_; 
     if($in_books){ 
       print $data->{Data}; 
     } 
} 
1; 
+2

Cette 'chose productOffering' ressemble étrangement familier pour moi: http://stackoverflow.com/questions/1719139/why-does-my-xsd-file-fail-to-parse-with-xmllibxml –

Répondre

4

Je vois deux choses qui pourraient être mal avec votre segment de code:

  • Dans votre méthode start_element, vous faites référence à une variable non déclarée $in_books. Cela devrait probablement être $in_productOffering. Astuce: si vous incluez use strict; en haut de votre module, perl donnera une erreur si vous utilisez accidentellement une variable non déclarée
  • Votre start_element méthode vérifie books, mais le fichier XML ne dispose que bks:books ou book éléments
  • Votre script commence par #!usr/bin/perl -w, mais cela nécessite probablement une barre oblique comme troisième caractère, par exemple #! **/** usr/bin/perl -w
  • L'analyseur SAX ne nécessite pas un fichier XSD
+0

I J'ai rectifié les erreurs mais ma question principale est de savoir comment puis-je obtenir le nom des attributs et leurs valeurs en utilisant l'analyseur syntaxique SAX? – Rachel

+0

Si votre modification de la question reflète vos modifications, vous déclarez toujours '$ in_productOffering' mais en utilisant' $ in_books'. Inclure 'use strict;' juste après 'package MyHandler;' – Andomar

+0

J'ai modifié les modifications comme suggéré, comment pouvons-nous obtenir le nom de l'attribut et leur valeur avec les noms des éléments et leurs valeurs? À l'heure actuelle, je ne reçois que la valeur des nœuds d'élément – Rachel

0

Il ressemble vous voulez imprimer un sous-ensemble de l'arborescence DOM. Utilisez XML::DOM. Voir aussi Why does my XSD file fail to parse with XML::LibXML?

+0

Je ne souhaite pas imprimer un sous-ensemble de l'arborescence DOM. Je voulais analyser un XML en utilisant l'analyseur SAX et générer des paires Nom de l'élément -> Valeur affichant tous les attributs et leurs paires. J'ai utilisé l'approche Andomar suggéré et je suis en mesure d'obtenir la valeur des attributs, mais la chose est qu'il est affiché dans la valeur de hachage et non leur forme réelle. Donc, hors de mon objectif de générer un nom d'élément, la paire de valeurs d'éléments avec le nom d'attribut et la paire de valeurs d'attributs avec leurs détails réels sont juste capables de générer des valeurs d'éléments et d'attributs en termes de hachage. – Rachel

Questions connexes