2009-11-16 4 views
0

Я пытаюсь разобрать XML в Perl, используя XML::SAX parser. Мой запрос касается генерирования значений атрибутов. Сейчас я способен генерировать только значения, присутствующие внутри элементов тегов, но моя цель состоит в том, чтобы произвести:Perl XML: SAX Parsing Error -> Значение атрибута не печатается

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

Вот мой 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> 

Вот мой пример 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> 

вот мой parser.pl файл:

#!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") 

Вот мой 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

Это 'productOffering' вещь звучит подозрительно знакомо мне: http://stackoverflow.com/questions/1719139/why-does-my-xsd-file-fail-to-parse-with-xmllibxml –

ответ

4

Я могу увидеть пару вещей, которые могли бы быть неправильно с сегментом кода:

  • В вашем методе start_element вы обратитесь к необъявленной переменной $in_books. Вероятно, это должно быть $in_productOffering. Совет: если вы включите use strict; в верхней части модуля, Perl выдаст ошибку, если вы случайно использовать необъявленную переменную
  • Ваш start_element проверки метода для books, но файл XML имеет только bks:books или book элементы
  • Ваш скрипт начинается с #!usr/bin/perl -w, но это, вероятно, требует слэш как третий знак, то есть #! **/** USR/бен/Perl -w
  • SAX-анализатор не требует файл XSD
+0

I исправили ошибки, но мой главный вопрос: как я могу получить имя атрибута и их значения с помощью SAX parser? – Rachel

+0

Если ваше изменение вопроса отражает ваши изменения, вы все равно объявляете '$ in_productOffering', но используете' $ in_books'. Include 'use strict;' right after' package MyHandler; ' – Andomar

+0

Я изменил изменения, как было предложено, как мы можем получить имя атрибута и их значение вместе с именами элементов и их значениями? Прямо сейчас я получаю только Element Nodes Value – Rachel

0

это выглядит вы хотите напечатать подмножество дерева DOM. Используйте XML::DOM. Смотрите также Why does my XSD file fail to parse with XML::LibXML?

+0

Я не хочу печатать подмножество DOM Tree. Я хотел проанализировать XML с использованием анализатора SAX и создать пары Element Name-> Value, отображающие все атрибуты и их пары. Я использовал подход, предложенный Andomar, и я могу получить значение атрибутов, но дело в том, что оно отображается в Hash Value, а не в их фактической форме. Таким образом, из моей цели генерации имени элемента, пары значений элемента с именем атрибута и парой значений атрибута с их фактическими данными просто можно генерировать значения элементов и значения атрибутов в терминах хэш-значения. – Rachel