您现在的位置是: 软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > webservice > 正文


-不学Flash 照样做闪客
-Delphi 网络与通讯开发专辑
-明明白白注册表工具
-PHP优化与安全

用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  下一页

【责任编辑:方舟】
【发表评论】【关闭窗口】
■ 相关内容
 开发工具开道--应用程序走进Web服务时代
 Web服务轻松进行企业应用集成
 Web服务器安全指南
 微软.NET Framework开创了XML Web服务的革命
 Visual Studio .NET快速地构建和部署XML Web服务和应用程序
 第二代Web服务展望
 .NET:微软大胆向Web服务的跳跃
 使用SQL Server 2000将现有代码作为Web服务提供
 构建高负载Web服务器
 使用UDDI的Web服务描述和发现之二
 使用UDDI的Web服务描述和发现之一
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!