【问题标题】:Perl XMLIn Parser Error - premature end of data problemsPerl XMLIn Parser Error - 数据问题过早结束
【发布时间】:2018-02-28 20:56:12
【问题描述】:

我是 Perl 和 XML 的新手,所以请耐心等待。

我的 XMLIn 随机出现问题,不喜欢返回的 XML 文件,即使我打开两个不同的 XML 返回文件它们是相同的。

我想出了这个解决方案:

#Send HTTP Request
my $browser = LWP::UserAgent->new();   
my $req = HTTP::Request->new(POST => $endpointurl);
$req->content("@XML");

#Get HTTP Response Status
my $resp = $browser->request($req);

#Get Response Status
my $parser = XML::LibXML::Simple->new();
my $xmlResp = ();
$xmlResp = eval { $parser->XMLin($resp->content()) };
unless ($xmlResp)
{
    $xmlResp = eval { $parser->XMLin($resp->content()) };
}

但我不确定这是否是“好习惯”,或者如果失败,让它循环返回的更好方法是什么。

这似乎可行,但我知道这并不“正确”。

***这部分代码是UPS提供的,不是我写的,也不是100%看懂。

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。见:minimal reproducible example
  • 我添加了出错的脚本位。告诉我你想看剧本会更有帮助。我对 Perl 和 XML 很陌生,正如您所知,我在这里的帖子很少。
  • 我更新了一些代码。我认为它正在使用 XML::LibXML,但它可能不是。提供的代码没有让我使用 XML::Simple Mod,但我对这一切都很陌生,也许使用 XML::LibXML::Simple 只是调用已弃用脚本的另一种方式?跨度>
  • @K.Davis 我没有添加解决方案。这只是显示我如何调用 mod 的更多代码。这是来自 UPS 的预制开发脚本,不是我写的,所以他们写的方式可能有问题。

标签: xml perl xml-parsing parse-error


【解决方案1】:

$resp->content 如果请求不成功,则包含错误消息,这是无效的 XML。如果是永久性错误,程序应该停止,如果是暂时性错误,则重试,并仅在成功时解析内容。

use LWP::UserAgent::Determined qw();
my $browser = LWP::UserAgent::Determined->new;
...
my $resp = $browser->request($req);
if ($resp->is_success) {
    my $parser = ... etc. etc.
} else {
    die sprintf "could not POST to <%s>:\nStatus %s\n%s\n"
        $endpointurl, $resp->status_line, $resp->content;
}

【讨论】:

  • 我知道错误是什么,这不是问题所在。问题是它试图处理不完整的 XML 文件,这就是为什么当我再次运行相同的命令时一切正常。必须有足够的时间来完成对文件的写入。这就是我能想到的。
  • 好吧,我怀疑 HTTP 请求缺少错误检查;我已经在上面编辑了我的答案。
  • 好的,看起来它会更好地捕捉错误,但这是否也能解决脚本在完成之前尝试读取 XML 文件的问题?如果我理解正确, $resp->is_success 的检查将检查它是否都在那里,但如果不是,它会失败。有没有办法让它检查,如果失败,等待并再次检查,如果第二次失败,则死亡?似乎是几毫秒的问题导致了问题。
  • 没有文件,这是一个 HTTP 响应。 is_success checks the status code only.你试过代码了吗?如果是,您是否仍然遇到解析失败? ––– 是什么让您认为request 方法完成后响应对象发生了变化?要么你误解了你所看到的,要么我们没有完整的画面。请让我们自己重现错误,猜测很烦人。
  • 完全可以理解!我会尝试你的代码,看看它做了什么,如果它仍然出错,我会告诉你,我会看看我能做些什么来让你尝试重新创建它。谢谢你的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多