【问题标题】:Perl XML: SAX Parsing Error -> Attribute value not printingPerl XML:SAX 解析错误 -> 属性值未打印
【发布时间】:2010-12-17 04:57:12
【问题描述】:

我正在尝试使用XML::SAX parser 在 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>

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

【问题讨论】:

标签: xml perl sax


【解决方案1】:

我可以看到您的代码段可能有一些问题:

  • 在您的start_element 方法中,您引用了一个未声明的变量$in_books。这应该是$in_productOffering。提示:如果你在模块顶部包含use strict;,如果你不小心使用了未声明的变量,perl 会报错
  • 您的start_element 方法检查books,但XML 文件只有bks:booksbook 元素
  • 您的脚本以#!usr/bin/perl -w 开头,但这可能需要斜杠作为第三个字符,即#!**/**usr/bin/perl -w
  • SAX 解析器不需要 XSD 文件

【讨论】:

  • 我已经纠正了错误,但我的主要问题是如何使用 SAX 解析器获取属性名称及其值?
  • 如果您对问题的编辑反映了您的更改,那么您仍然声明$in_productOffering,但使用$in_books。在package MyHandler; 之后包含use strict;
  • 我已按照建议修改了更改,我们如何获取属性名称及其值以及元素名称及其值?现在只获得元素节点值
  • start_element方法中,属性在$data-&gt;{Attributes}中。您可以访问 id 元素,例如$data-&gt;{Attributes}-&gt;{'{}id'}-&gt;{Value}{} 代表“无命名空间”
  • 我们是否每次都需要添加我们需要打印的属性,或者是否有任何方法使用 SAX 在遍历它时生成属性名称 - 属性值和元素名称 - 元素值?跨度>
【解决方案2】:

看起来您想打印 DOM 树的一个子集。使用XML::DOM。另见Why does my XSD file fail to parse with XML::LibXML?

【讨论】:

  • 我不想打印 DOM 树的子集。我想使用 SAX 解析器解析 XML 并生成元素名称-> 值对,以显示所有属性及其对。我使用了 Andomar 建议的方法,我能够获取属性值,但问题是它以哈希值而不是它们的实际形式显示。因此,出于生成元素名称的目标,带有属性名称的元素值对和带有实际详细信息的属性值对能够根据哈希值生成元素值和属性值。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多