| | | 用Perl和XML轻松开发多种界面的Web服务 | | 2002-05-31·
·刘彦青编译··yesky
| 上一页 1 2 3 4 下一页 其次,我们创建包含由通过调用compare_as_dom()方法生成的比较结果的DOM树。将这次调用封装在一个eval块中,以确保我们能够获得在处理上传的文档时发生的解析错误。在稍后,我们将仔细地研究 compare_as_dom()和dom_from_data()方法。
eval { $context->{domtree} = $self->compare_as_dom( $file1, $file2 ); };
if ( $@ ) { $error = $@; } } else { $error = 'You must select two XML files to compare and wait for them to finish uploading'; }
if ( $error ) { $context->{domtree} = $self->dom_from_data( { error => $error } ); } | 如果二个文档完全相同,compare_as_dom()返回一个示定义的字符。如果没有返回DOM对象,也没有错误产生,我们创建一个只包含告诉用户二个文档相同的一个<message>元素的文档。
unless ( defined( $context->{domtree} )) { my $msg = "Files are semantically identical."; $context->{domtree} = $self->dom_from_data( { message => $msg } ); } } | 在完成信号收集事件后,我们就可以继续编写信号收集事件和SOAP调度程序共享的核心方法了。
首先,我们需要来创建compare()方法。它不仅仅是同名的XML::SemanticDiff的方法的容器,它还接受二个包含被比较的XML文档的句柄并返回结果。
sub compare { my $self = shift; my ( $xmlstring1, $xmlstring2 ) = @_; my $diff = XML::SemanticDiff->new( keeplinenums => 1 ); my @results = $diff->compare( $xmlstring1, $xmlstring2 ); return \@results; } | dom_from_data()方法通过XML::Generator::PerlData对任何公用Perl数据结构的引用进行处理创建一个XML::LibXML::Document对象(DOM树形式的XML文档),并将生成器与XML::LibXML::SAX::Builder连接生成DOM树。还记得吗,我们在结果事件回调中调用了该方法来创建包含有适当信息的DOM树。
sub dom_from_data { my ( $self, $ref ) = @_; my $builder = XML::LibXML::SAX::Builder->new(); my $generator = XML::Generator::PerlData->new( Handler => $builder ); my $dom = $generator->parse( $ref ); return $dom; } | 最后,我们将创建compare_as_dom()方法。它也是最后的二个方法的容器,它以DOM树的形式返回二个文档的比较。
sub compare_as_dom { my $self = shift; my $diff_messages = $self->compare( @_ ); return undef unless scalar( @{$diff_messages} ) > 0; return $self->dom_from_data( { difference => $diff_messages } ); }
1; | 在创建了上面的方法后,我们就仅需要创建提供能够供各种客户端应用程序访问的CGI脚本了,这也是需要综合利用CGI::XMLApplication和SOAP::Lite 的地方。
#!/usr/bin/perl -w use strict; use SOAP::Transport::HTTP; use WebSemDiff;
if ( defined( $ENV{'HTTP_SOAPACTION'} )) { SOAP::Transport::HTTP::CGI -> dispatch_to('WebSemDiff') -> handle; } else { my $app = WebSemDiff->new(); $app->run(); } | SOAP::Lite的dispatch_to()方法连接SOAP与一特定的模块(或模块的目录)。在本例中,它使我们能够重用实现浏览器界面的WebSemDiff类,模块的共享意味着CGI只不过是一个请求代理,它提供了对基于连接客户端应用应用程序类的方法的访问。通过互联网浏览器访问应用程序的用户被提示上传二个XML文档,并通过compare_as_dom()方法获取结果,SOAP客户端只可以直接访问compare_as_dom、更低级的compare()等方法。
至此,我们已经开发了一个能够运行的应用程序。下面我们就来用一些客户端与它进行连接,比较二个文档,并返回相应的结果。
上一页 1 2 3 4 下一页 | | | 感谢
访问天极网,如果您觉得该文章涉及版权问题,请看这里!
|
|