Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl XML:SAX解析错误->;属性值不打印_Xml_Perl_Sax - Fatal编程技术网

Perl XML:SAX解析错误->;属性值不打印

Perl XML:SAX解析错误->;属性值不打印,xml,perl,sax,Xml,Perl,Sax,我正在尝试使用Perl解析XML。我的问题是关于生成属性值。现在,我只能生成标记元素中存在的值,但我的目标是生成: Element Name: Element Value: Element Attribute Name: Element Attribute Value: Element Child Name: Element Child Value Element Child Attribute Name: Element Child Attribute Value

我正在尝试使用Perl解析XML。我的问题是关于生成属性值。现在,我只能生成标记元素中存在的值,但我的目标是生成:

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>
这是我的
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;

我可以看出您的代码段可能存在一些问题:

  • start\u元素
    方法中,引用了\u书籍中未声明的变量
    $。这可能是
    $in_productoffing
    。提示:如果包含
    则使用strict
    如果您不小心使用了未声明的变量,perl将在模块顶部给出一个错误
  • 您的
    start\u元素
    方法检查
    books
    ,但XML文件只有
    bks:books
    book
    元素
  • 您的脚本以
    #开头!usr/bin/perl-w
    ,但这可能需要一个斜杠作为第三个字符,即#**/**usr/bin/perl-w
  • SAX解析器不需要XSD文件

我可以看出您的代码段可能存在一些问题:

  • start\u元素
    方法中,引用了\u书籍
    中未声明的变量
    $。这可能是
    $in_productoffing
    。提示:如果包含
    则使用strict
    如果您不小心使用了未声明的变量,perl将在模块顶部给出一个错误
  • 您的
    start\u元素
    方法检查
    books
    ,但XML文件只有
    bks:books
    book
    元素
  • 您的脚本以
    #开头!usr/bin/perl-w
    ,但这可能需要一个斜杠作为第三个字符,即#**/**usr/bin/perl-w
  • SAX解析器不需要XSD文件

看起来您想要打印DOM树的一个子集。使用。另请参见

您似乎想要打印DOM树的子集。使用。另请参见

我已纠正了错误,但我的主要问题是如何使用SAX解析器获取属性名称及其值?如果对问题的编辑反映了您的更改,则您仍然在产品提供中声明
$,但在书籍中使用
$
。包括
使用严格就在
包MyHandler之后我已经按照建议修改了更改,我们如何获得属性名及其值以及元素名及其值?现在我只在
start\u元素
方法中获取元素节点值,属性在
$data->{attributes}
中。您可以访问id元素,如
$data->{Attributes}->{{{}id}->{Value}
{}
代表“无名称空间”我们是否每次都需要添加需要打印的属性,或者是否有任何方法使用SAX在遍历时生成属性名称-属性值和元素名称-元素值?我已经纠正了错误,但我的主要问题是如何使用SAX解析器获取属性名称及其值?如果您对问题反映了您的更改,您仍然在产品提供中声明
$,但在书籍中使用
$。包括
使用严格就在
包MyHandler之后我已经按照建议修改了更改,我们如何获得属性名及其值以及元素名及其值?现在我只在
start\u元素
方法中获取元素节点值,属性在
$data->{attributes}
中。您可以访问id元素,如
$data->{Attributes}->{{{}id}->{Value}
{}
代表“无名称空间”我们是否每次都需要添加需要打印的属性,或者是否有任何方法使用SAX在遍历它时生成属性名称-属性值和元素名称-元素值?这件
ProductOffing
事情听起来让我很熟悉:这件
ProductOffing
事情听起来很可疑我很熟悉:我不想打印DOM树的子集。我想使用SAX解析器解析XML,并生成显示所有属性及其对的元素名->值对。我使用了Andomar建议的方法,我能够得到属性值,但问题是它是以哈希值显示的,而不是它们的实际形式。因此,出于我生成元素名的目标,元素值对和属性名以及属性值对的实际细节,我只能根据哈希值生成元素值和属性值。我不想打印DOM树的子集。我想使用SAX解析器解析XML,并生成显示所有属性及其对的元素名->值对。我使用了Andomar建议的方法,我能够得到属性值,但问题是它是以哈希值显示的,而不是它们的实际形式。因此,出于生成元素名的目的,我只需要根据散列值生成元素值和属性值,元素值对和属性名和属性值对以及它们的实际细节。
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;