Article View: cn.bbs.comp.xml
Article #217���� Perl ������Ա�� XML���� 2 ����(ת��)
From: <Test/>
Date: Tue, 27 Apr 2010 15:35
Date: Tue, 27 Apr 2010 15:35
210 lines
18465 bytes
18465 bytes
��ϵ��������Ϊ��Щ��Ҫһ�ֿ�ݵ� XML/Perl ����������˱�д�ġ��� 1 ���ֿ����� XML::Simple���� XML ���ɵ� Perl Ӧ�ó����е�һ�ֹ��ߡ����DZ�ϵ�еڶ�ƪ���£��� Perl ����Ա����������Ҫ�� XML �������������������¼���Ľ�����
���
���ںܶ� Perl Ӧ�ó�����˵����ѡ�� XML ������ XML::Simple�����DZ�ϵ�����µ� 1 ���ֵ����⣨����� �ο����ϣ���XML::Simple �� XML �����ļ�ת�������ڲ����� Perl ��ݽṹ��Ȼ��������ݽṹ��Ϊ XML д�ء�����Ҫ��ס����Щ����²���ʹ�����ַ�����
�����Ҫ���ڴ��н��� XML �ĵ��ı�ʾ��Ȼ����и��ӵĻ�Ԥ���������ת����XML::Simple ������õİ취�����������Ӧ��ʹ������������� XML �ĵ�����ȫ��װ���ڴ�����dz���δ֪�������Ͳ���ʹ�� XML::Simple����ʱ����ʹ���¼���Ľ���������������Ϊ�¼���Ľ�����է�������е���֣�����һ��ϰ�������ֽ�����ʽ��SAX Ҳ����Ϊ����ѡ�Ĺ��ߡ�
���ĺ��潫����������ʹ�� Perl ���� XML �ĸ�������
����
��Ȿ����ҪһЩ����Դ��� Perl ģ�顣ͨ�������ַ�����ã�������ϵͳ�� Windows����ʹ�� ppm��������ϵͳ�� UNIX �� Linux����ʹ�� CPAN������� �ο����� �е����ӣ��������Ϥ��Щ�洢�⣬��ϵ�еĵ� 1 �����ṩ����ؽ��ܡ�
�嵥 1 ˵��������� UNIX/Linux �����л����Щģ�顣��Ȼ�����Ϊ root ��¼������Ļ�ϵͳ�ϵ������ʻ�����ʹ����Щģ�顣��Щģ����һЩ�������Щ����ϵͳ��û�С���ȷ���� cpan��follow=yes����������Щ�������Զ���װ��
�嵥 1. �� CPAN ��ȡ�����õ���ģ��
$ perl -MCPAN -e shell
cpan> install XML::LibXML XML::SAX::Base XML::SAX::ExpatXS XML::SAX::Writer
cpan> quit
�� Windows �¸�����嵥 2 ��ʾ��ͬ������� admin �˻����а�װ��
�嵥 2. ʹ�� PPM ���ģ��
$ppm install XML::LibXML XML::SAX::Base XML::SAX::ExpatXS XML::SAX::Writer
������
�������Ա���ܷ��ְ� XML ����һ�����ṹ��㡣��������Ŭ�������� XML �۵㱻�淶��Ϊ�ĵ�����ģ�ͣ�DOM����2002 �귢���� DOM Level 3��
DOM �� XML �ĵ���ʾ��˫���ӽڵ���ɵ�����ÿһ���ϵĵ�һ���������ӵ����ڵ�����е��ֵܽڵ㡣�ֺ��������϶��壬����������Զ���ʵ�֡�
��Ȼ�����������ӱ����������ӽ�Լ����Աʱ������˵��ʹ�� XPath Э��ͨ��Ч�ʸ�ߡ�����һ�����ڱ���ڵ㡢�����ڵ���ȵ������ԡ�
���� DOM �淶�����Լ�����������Ķ��� DOM �淶��XPath �����Э��Ľ��������£������ �ο����ϡ�
�ܶ� Perl ģ���ܹ��� XML �ĵ������� DOM �������� Petr Pajas �� XML::LibXML ����õ�һ��������� �ο����ϣ������װ�� Gnome ��Ŀ�� libxml2��������һ�ֹ������Ƶİ����а��� DOM ��������XPath �IJ���ʵ�ֺ� SAX2 ʵ�֣����� ���ۣ���
�嵥 3 �DZ�ϵ�е� 1 ������ʹ�õ� XML �ļ�������� �ο����ϣ�����ʱ������ XML::Simple ���������ʾ�� Perl ��ݽṹ���ģ�Ȼ��ʹ�� XML::Simple ��ת�����ı���ʽ�� XML��
�嵥 3. Rosie �ij����̵꣬pets.xml
<?xml version='1.0'?>
<pets>
<cat>
<name>Madness</name>
<dob>1 February 2004</dob>
<price>150</price>
</cat>
<dog>
<name>Maggie</name>
<dob>12 October 2002</dob>
<price>75</price>
<owner>Rosie</owner>
</dog>
<cat>
<name>Little</name>
<dob>23 June 2006</dob>
<price>25</price>
</cat>
</pets>
ʹ�� XML::LibXML ������dz����� �嵥 4 ��ʾ����������� �嵥 5����һ���� $parser->parse_file ���ܴ��� DOM ģ�͵� XML ���ṹ�����ﶨ����һ���� Perl ����������е�һ���ڵ�������Ԫ�أ�Ȼ���������ʾ�����³��������������������ʹ������� addPet() ��Ŀ¼�������ֻ�³��һֻɳ���һֻ����
�嵥 4. XML::LibXML ���� Rosie �Ŀ���ļ�
#!/usr/bin/perl -w
use strict;
use XML::LibXML;
my $parser = XML::LibXML->new;
my $doc = $parser->parse_file('pets.xml')
or die "can't parse Rosie's stock file: $@";
my $root = $doc->documentElement();
sub addSubElm($$$) {
my ($pet, $name, $body) = @_;
my $subElm = $pet->addNewChild('', $name);
$subElm->addChild( $doc->createTextNode($body) );
}
sub addPet($$$$) {
my ($type, $name, $dob, $price) = @_;
# addNewChild is non-compliant; could use addSibling instead
my $pet = $root->addNewChild('', $type);
addSubElm ( $pet, 'name', $name );
addSubElm ( $pet, 'dob', $dob );
addSubElm ( $pet, 'price', $price );
}
addPet('gerbil', 'nasty', '15 February 2006', '5');
addPet('hamster', 'boris', '5 July 2006', '7.00');
my @nodeList = $doc->getElementsByTagName('price');
foreach my $priceNode (@nodeList) {
my $curPrice = $priceNode->textContent;
my $newPrice = sprintf "%6.2f", $curPrice * 1.2;
my $parent = $priceNode->parentNode;
my $newPriceNode = XML::LibXML::Element->new('price');
$newPriceNode->addChild ( $doc->createTextNode( $newPrice ) );
$parent->replaceChild ( $newPriceNode, $priceNode );
}
print $doc->toString(1); # pretty print
Ϊ�˰������һ������ DOM���������ǽ��õ����еļ۸�ڵ������б?�Ӽ� 20�������ڿ����ö���ı��ڵ��ʾԪ���е��ı����۸���İ취���Ǵӽڵ���ȡ�ü۸����Ӻ�ı��ʽ��Ȼ�������滻ԭ���Ľڵ㣬���Ǿ͵��ġ����ַ�����ȻҪ�ȵ� 1 �����е� Perl ���븴�ӵöࡣ
�嵥 5. ��������������������?
<?xml version="1.0"?>
<pets>
<cat>
<name>Madness</name> <dob>1 February 2004</dob>
<price>180.00</price>
</cat>
<dog>
<name>Maggie</name> <dob>12 October 2002</dob> <price>
90.00</price>
<owner>Rosie</owner>
</dog>
<cat>
<name>Little</name> <dob>23 June 2006</dob> <price>
30.00</price>
</cat>
<gerbil>
<name>nasty</name><dob>15 February 2006</dob><price>
6.00</price>
</gerbil>
<hamster>
<name>boris</name><dob>5 July 2006</dob><price>
8.40</price>
</hamster>
</pets>
ʹ�ø��������������� XML ʱͨ����������������XML �ı���ʽ��Դ���뱻ת������ DOM ����Ҫ���������ɱ���ڵ㡢�������Ӵ�һ���ڵ㵽��һ���ڵ㣬����ʹ������ XPath �����ö���ڵ����á�Ȼ����ͨ����Щ���ñ༭�ڵ㡣����ٰ���д�ش��̻����������ĸ�ʽ��ӡ��
����С�ġ��������ӹ��̴������˵ʹ�� XML::Simple ͨ������������ǣ���� XML �ĵ��dz����ӣ������ܹ�ʹ�� getElementsByTagName �������XML::LibXML ����ʡ���Ȼ���ַ��������������ܱ��ֹ����� Perl �� XML::Simple �����Ҫ��д��Ҳ����Ҫ���ԡ�
�����¼��Ľ�����SAX
Simple API for XML (SAX) ��������ȫ��ͬ�Ľ������������ַ�����һ��ʼ������һЩ��SAX ���ĵ�����һϵ���¼���Ҫ��������������Ӧÿ���¼������� start_document��end_document��start_element��end_element �� characters���ο����� �е� Perl SAX 2.1 Binding �ṩ��������嵥�������κ��ĵ���Perl ����Ա������ʹ��һ�鴦��������ֱ��Ӧÿ���¼���
��Ȼ�������dz����£��в����ظ�����ʵ����Ҳ��һ�ֻ�ᣬ����������
��Ȼ XML::LibXML �ṩ�� SAX �ӿڣ�����Ȼ��һ�� DOM �����������Ҫ������ĵ��������ڴ�Ȼ�����ṩ�����¼��Ľӿڡ���Ȼ�������ã����Dz��ܴ��?���ڴ������� XML �ĵ����� XML �������� Jabber/XMPP��������ǽ�ʹ�� XML::SAX::ExpatXS����ģ���װ�� James Clark �Ĺ��ϵ� expat ���������ɿ������ٶȿ졣
������һ���¿��ij���꣬�����DZ�ϵ�е� 1 �����е��Ǹ�����һ���嵥 6 ��ʾ���̵���Ŀ¼�е�һ���֡�
�嵥 6. Lizzie �� Petatorium��pets2.xml
<stock>
<item type="iguana" cost="124.42" location="stockroom" age="1"/>
<item type="pig" cost="15" location="floor" age="0.5"/>
<item type="parrot" cost="700" location="cage" age="6"/>
<item type="pig" cost="117.50" location="floor" age="3.2"/>
</stock>
Ϊ��ʹ�� SAX2 ��������ҪһЩ���봦���������ɵ��¼�������¼��������������ÿ���¼��е�һЩ�ı��ĸ�д�����嵥 7 �еĴ�������½��� XML��
�嵥 7. SAX ���� pets2.xml
#!/usr/bin/perl -w
#use strict;
use XML::SAX::ParserFactory;
use XML::SAX::Writer;
my $writer = XML::SAX::Writer->new;
$XML::SAX::ParserPackage = "XML::SAX::ExpatXS";
my $parser = XML::SAX::ParserFactory->parser(Handler => $writer);
eval { $parser->parse_file('pets2.xml') };
die "can't parse Lizzie's stock file: $@" if $@;
XML ��ɵĽ�����嵥 8 ��ʾ��
�嵥 8. SAX ���������
<?xml version='1.0'?><stock>
<item cost='124.42' location='stockroom' type='iguana' age='1' />
<item cost='15' location='floor' type='pig' age='0.5' />
<item cost='700' location='cage' type='parrot' age='6' />
<item cost='117.50' location='floor' type='pig' age='3.2' />
</stock>
ʹ�� ExpatXS ��Ҫע�����¼��㣺
* Ҫ��֤���еĹ���Ҫô�� SAX Ҫô�� SAX2������Ҫ���ʹ�á���� �嵥 7 ��ʹ�� XML::Handler::YAWriter ���� XML::SAX::Writer���Ϳ������κδ�����Ϣ�������Ҳ�����һ���ӻ⡣���� ExpatXS ��һ�� SAX2 �����������Ҳ����ʹ�� SAX2 ��д����
* Ϊ�˼��������������� eval �ѽ�����װ������Ȼ����� $@ ���� $!��
* ʹ��֮ǰ�������ô��������֪������Ȼ����Ա�� SAX �����������Ǵ����Ҵ���Ĺܵ������� ��Ҫ��һ�����ͣ�������ʼ���������������С�����˵���ڹܵ� P > W����Ҫ�����෴��˳���ʼ������ W �� P��
������ɸѡ��
SAX ���������������˳�����SAX ������һ���¼��������������һϵ���¼�����ÿ���¼����ݸ�һ�������������һ���ܹ��Ӳ�ͬ�Ƕȹ۲�ij���ģ�顣�ͽ�����һ��������� SAX �¼�����ͬʱҲ��һ����������ڳе���������ɫ��ͬʱ��Ҳ��ͨ���ñ�Ӵ����κα� SAX �¼��������¼����ݸ���һ�����������˵������һ��Ĭ�ϵķ����������ڴ����¼���������Щ������ģ���� XML::SAX::Base��
Ҫ�����κο��ܵ� SAX �¼����������Ա������չ XML::SAX::Base ����д�κ���Ҫ�ķ����������¼�����Ҫ���?��Щ�¼�����������������һ�𣬴Ӷ��ܹ������� UNIX ����������Ĺܵ�����Щ��������ж���õĽӿ��Լ�������ȷ�����ݣ�XML��
�����ڹܵ������˶��Ѳ���ͬ��ķ�����չ����һ����������� SAX2 ��������ʹ�� XML �ĵ�����¼�����ʵ�ϣ�������������κ���� SAX �¼��ij��ȷ�˵�����Ա�дһ��ģ���ȡ��ݿ�?��� SAX �¼�������Ҳ����������¼������� XML::Generator::DBI����
ͨ���ܵ�����һ��ʹ�� SAX �¼�������ĵ���XML::SAX::Writer ���������������������Ҳ������д����ݿ⣨XML::SAX::DBI����
��Ҫ��������ĺô��������������ת���¼����� SAX ���������һ���Ѿ�ʵ�֣���������ٸ�����Դ��� Perl ģ��ʵ���� SAX 2.1 ������� �ο����ϣ�����Σ�����ζ�������Ա���Լ��о���������ṩ���蹦�ܵĴ���������������еĴ��������������ɹ��������߶����õ����Ļ�����Դ���߰��ij���Ա����ʱ�䡣
XML::SAX::Base ����ϸ����
ʹ�� Kip Hampton �� XML::SAX::Base ��ƴ������ֻ��Ҫ�������衣���ȴ�����������չ���ࡣ��Σ�����Ա������д��Ҫ�Ļ�����Ȼ��Ϳ��Է����¼����ߵ�����д�˻���ķ�����������������ó����еķ���������дģ���еķ��������嵥 9 ��ʾ����
�嵥 9. ʹ�� XML::SAX::Base
package XyzHandler;
use base qw(XML::SAX::Base); # extend it
sub start_element { # override methods as necessary
my $self = shift;
my $data = shift; # parameter is a reference to a hash
# transform/extract/copy data
$self->SUPER::start_element($data);
}
������
��ϵ�����·�Ϊ��֣����ǵ� 2 ���֣���Ҫ�����˸��ӵ� XML �������硣
��������˵������ν� XML �ĵ�ת�����ڴ��еĶ�������һ��ʼ��������Ա�������ַ��������ã��Ӻܶ�Ƕ���˵������ܺ��ʵ�װ���ڴ�Ҳȷʵ�ܷ��㡣
Ȼ������� SAX �ͻ����¼��Ľ�������� XML �ĵ��dz��������һ������ֹ����������������ַ�������������Ĵ����������εĹ��߱����γ���һ����ȫ��ͬ�ı�̷�dz��ḻ��SAX �ܵ���
��ϵ�е���һƪ���½�˵���ڸ��ӵ�Ӧ�ó��������ʹ����Щ������DOM �� SAX ������
-------------------------------------------------------------
ת�ԣ�http://tilt.lib.tsinghua.edu.cn/node/562
--
[1;36mHappy XMLing
[m[1;35m�� ��Դ:��ˮľ���� newsmth.net��[FROM: 114.249.210.*][m
Technical Details
Message-ID:
<4lX9G2$Cjr@newsmth.net>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!feeder.news-service.com!de-l.enfer-du-nord.net!feeder2.enfer-du-nord.net!feeds.phibee-telecom.net!news.byr.edu.cn!news.newsmth.net!NEWSMTHShow Full Headers
Complete Article Headers
X-Google-Thread: 115571,3f4940257493787f,start X-Google-NewGroupId: yes X-Google-Attributes: gidf7ebf7e2af,domainid0,public,usenet X-Google-Language: Chinese,GB Path: arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!feeder.news-service.com!de-l.enfer-du-nord.net!feeder2.enfer-du-nord.net!feeds.phibee-telecom.net!news.byr.edu.cn!news.newsmth.net!NEWSMTH From: thinkhy@newsmth.net-SPAM.no (<Test/>) Newsgroups: cn.bbs.comp.xml Subject: ���� Perl ������Ա�� XML���� 2 ����(ת��) Date: 27 Apr 2010 15:35:17 GMT Organization: ˮľ���� Message-ID: <4lX9G2$Cjr@newsmth.net> Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit X-Filename: XML/c/M.1272382466.80