Perl XML: ошибка синтаксического анализа SAX -> значение атрибута не печатается - PullRequest
0 голосов
/ 16 ноября 2009

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

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 ]

4 голосов
/ 17 ноября 2009

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

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

Похоже, вы хотите напечатать подмножество дерева DOM. Используйте XML :: DOM . См. Также Почему мой XSD-файл не может анализироваться с XML :: LibXML?

...