【问题标题】:Handling the xml parser error处理 xml 解析器错误
【发布时间】:2016-02-07 17:12:00
【问题描述】:

我有很多 XML 文件,我必须阅读它们,然后查看它们是否有效。我有一些文件缺少结束标签。现在我的任务是编写一个读取这些文件的代码,并在存在无效文件时打印错误消息和文件名,然后转到下一个文件。

我是 Perl 和 XML 的新手。但是,如果我知道如何处理存在 entag 错误,那么我就可以休息了。我所知道的是我在代码中有这样一行并读取 XML 文件然后查找解析。如果不正常,则将在命令行中产生错误。我的目标是有一个条件,然后我会写一条消息。

 use strict;
 use warnings;
 use XML::LibXML;
 use XML::Simple;
 use XML::LibXML::XPathContext qw( );
 use XML::Writer;

 # reads all file
 my @testFile = <*.xml>;

 my $arrSize = @testFile;
 XML::LibXML::XPathContext->new()
 my $doc = XML::LibXML->load_xml(location => $ver);
 my $name_ver = $xml->findnodes('/Info/Name',$doc);
 ##  do some other things

我希望这在某种程度上是清楚我的意思。谁能告诉我如何编写一个不允许代码停止的条件,而是转到另一行并打印一条消息。

【问题讨论】:

  • 你的问题很难理解。你有一个文件列表。你解析每一个。如果 XML 无效,是否要跳过一个文件,并继续解析下一个文件?
  • 正确然后打印出文件名并进入下一个文件
  • 在这种情况下,请添加您已经为循环和文件读取编写的代码。您可以通过删除与问题无关的内容(即实际处理)来简化它。你可以edit这个问题。

标签: xml perl xml-libxml


【解决方案1】:

将您的解析操作包装在eval 中,并捕获$@

使用我更了解的库:

#!/usr/bin/env perl
use strict;
use warnings; 
use XML::Twig; 

foreach my $file ( glob "*.xml") {
     eval { XML::Twig -> new() -> parsefile ( $file ) }; 
     if ( $@ ) { 
          print "$file not valid XML: $@\n"; 
     }
     else {
          print "$file parsed successfully\n";
     }
}

这种方法应该适用于 Perl 中的大多数 XML 解析器,因此只是说明性的。根据设计和规范,损坏的 XML 应该是一个致命错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 2013-11-03
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多