jjzjj

xml - 对 Perl Handlers 有很好的介绍吗?

coder 2024-07-01 原文

我正在使用 Perl mod XML::SemanticDiff,它可以比较两个 XML 文档。我想编写自己的自定义处理程序,但作为 Perl 的新手,我不知道如何做到这一点。

我知道处理程序只不过是在某些事件发生时调用的子例程。但我不清楚这些事件如何调用我的代码中的方法的实现细节。

例如,这个模块的基本实现是这样开始的:

my $diff = XML::SemanticDiff->new(keepdata=> 1, keeplinenums => 1, diffhandler => 1);
my @changes = $diff->compare($file1, $file2);

我知道我的自定义处理程序看起来像这样:

sub element_value($self, $element, $to_element_properties, $fromdoc_element_properties) {
  my ($self, @args) = @_;

}

但是是否需要中间代码来实际调用这个子程序?类似的东西,

foreach my $change (@changes) {
  $change->element_value(some_arguements_here);
}

或者当 $diff->compare($file1, $file2); 执行时自动调用处理程序?

如有任何指点,我们将不胜感激。

最佳答案

是的,它们是由引擎“自动”调用的。

如果您查看源代码(链接到库的 CPAN 页面 XML::SemanticDiff),您会发现它是如何轻松完成的:

sub compare {
    # ... some code

       # element value test
        unless ($from_doc->{$element}->{TextChecksum} 
             eq $to_doc->{$element}->{TextChecksum}) {
            push (@warnings, $handler->element_value($element, 
                                                     $to_doc->{$element}, 
                                                     $from_doc->{$element}))
                      if $handler->can('element_value');
        }

处理程序子程序分为三种(取决于使用它们的库的设计方式):

  1. 预定义名称。意思是,该库旨在在特定情况下始终调用名为“XYZ()”的固定名称的子。就“在哪个命名空间中搜索具有该名称的子项”而言,要做到这一点非常棘手?要解决该问题,更常见的方法是 #2:

  2. 具有预定义方法名称的自定义差异处理程序类。从XML::SemanticDiff可以看出文档,您的图书馆就是这种情况。

    该类通常继承自一些现有的具有默认处理程序的基处理程序类,这些处理程序应该被您的自定义子类覆盖。或者,它只需要实现一些/所有预定义的方法,而不必继承(这里是后者)。

    在 XML::SemanticDiff 的情况下,您通过给它一个自定义处理程序类的对象来告诉模块您的自定义处理程序是什么:

    use XML::SemanticDiff;
    use MyCustomHandlerModule;
    my $handlerObj = MyCustomHandlerModule->new();
    my $diff = XML::SemanticDiff->new({ diffhandler => $handlerObj });
    
  3. 注册处理程序。大多数情况下,注册是通过传递子例程引用来处理的:

    sub myHandler1 { ... };
    sub myHandler2 { ... };
    my $obj = My::Library->new({ Event1_handler => &myHandler1
                               , Event2_handler => &myHandler2 })
    

    第二种方法更灵活,使用频率也高得多。

关于xml - 对 Perl Handlers 有很好的介绍吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855225/

有关xml - 对 Perl Handlers 有很好的介绍吗?的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  3. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

    我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

  4. ruby - 如何使用 Nokogiri::XML::Builder 生成动态标签? - 2

    我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi

  5. ruby - 如何让 Nokogiri 解析并返回 XML 文档? - 2

    这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::

  6. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  7. ruby - 模式加载时出现 Nokogiri::XML::Schema SyntaxError - 2

    我正在尝试加载SAML协议(protocol)架构(具体来说:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但在执行此操作之后:schema=Nokogiri::XML::Schema(File.read('saml11_schema.xsd'))我得到这个输出:Nokogiri::XML::SyntaxErrorException:Element'{http://www.w3.org/2001/XMLSchema}element',att

  8. ruby-on-rails - 有没有一种很好的方法来检查一个字符串是否至少包含一个字符串数组中的一个字符串? - 2

    string.include?(other_string)用于检查一个字符串是否包含另一个字符串。有没有一种很好的方法来检查字符串是否至少包含字符串数组中的一个字符串?string_1="amonkeyisananimal.dogsarefun"arrays_of_strings_to_check_against=['banana','fruit','animal','dog']这将返回true,因为string_1包含字符串'animal'。如果我们从arrays_of_strings_to_check_against中删除'animal',它将返回false。请注意arrays_o

  9. ruby-on-rails - 来自 cucumber 的 HTTP POST XML 内容 - 2

    我正在尝试通过POST将XML内容发送到一个简单的Rails项目中的Controller(“解析”)方法(“索引”)。它不是RESTful,因为我的模型名称不同,比如“汽车”。我在有效的功能测试中有以下内容:deftest_index...data_file_path=File.dirname(__FILE__)+'/../../app/views/layouts/index.xml.erb'message=ERB.new(File.read(data_file_path))xml_result=message.result(binding)doc=REXML::Document.ne

  10. ruby-on-rails - Rails 3 上的 404 err 部署到 AWS...很好,除了 EB 不复制/ondeck 到/current - 2

    当我部署Rails应用程序时,我遇到了一些导致nginx1.2.3404错误的错误。在部署期间,EB说:“错误:某些实例未响应命令。未从[i-a054e9de]收到响应。”我可以登录到我的EC2并在var/app中“mvondecktocurrent”然后“touchcurrent/tmp/restart.txt”然后应用程序将正确部署并正常工作。它具有所有依赖项并正确连接到RDS数据库。问题是:我如何让aws服务器(elasticbeanstalk)进行最后的部署步骤,将ondeck复制到当前?我的配置文件中是否遗漏了什么?是否有我不小心更改了EB配置中的设置?顺便说一句,一切都很好

随机推荐