我正在尝试使用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;
答案 0 :(得分:4)
我可以看到您的代码段可能出现的一些问题:
start_element
方法中,您引用了未声明的变量$in_books
。这应该是$in_productOffering
。提示:如果您在模块顶部包含use strict;
,那么如果您意外使用未声明的变量,perl会出错。start_element
方法检查books
,但XML文件只有bks:books
或book
元素#!usr/bin/perl -w
开头,但这可能需要斜杠作为第三个字符,即#!** / ** usr / bin / perl -w 答案 1 :(得分:0)
看起来您想要打印DOM树的子集。使用XML::DOM。另请参阅Why does my XSD file fail to parse with XML::LibXML?