科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件用Perl和XML轻松开发多种界面的Web服务

用Perl和XML轻松开发多种界面的Web服务

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

与Web服务有关的的一个基本问题是如何创建一个既能够通过基于浏览器的客户端又能够通过编程方式让客户端自动访问应用程序。

作者:刘彦青编译 来源:yesky 2007年11月17日

关键字: 软件

  • 评论
  • 分享微博
  • 分享邮件
其次,我们创建包含由通过调用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()等方法。

   至此,我们已经开发了一个能够运行的应用程序。下面我们就来用一些客户端与它进行连接,比较二个文档,并返回相应的结果。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章