-1

我正在尝试从 HTTPS 网站获取文本。我已经使用 LWP 完成了这项工作,但我需要解析信息,因为它是 XML。我想我已经找到了如何做我想做的事情,XML::LibXML但我无法LWP::UserAgent使用它访问数据。

这是我的代码:

#! usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use open qw(:std :utf8);
use 5.014;
use IO::Socket::SSL qw();
use XML::LibXML;

BEGIN {
    $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
    $ENV{HTTPS_DEBUG} = 1;
}

my $ua = LWP::UserAgent->new(ssl_opts => {
    SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE,
    verify_hostname => 0, 
});

my $response = $ua->get('https:<mywebsite>');

my $t = '';

if ( $response->is_success ) {
    $t = $response->decoded_content;
}
else {
    die $response->status_line;
}


my $parser = XML::->new();
my $xmldoc = $parser->parse_file($t);

print $xmldoc;

我收到错误: No such file or directory消息,我尝试的每个解析器方法都会出错,并且 LibXML 解析器字符串方法不起作用,因为我的数据有很多行。我需要一种方法来欺骗XML::LibXML认为$t是文件或文件句柄,或者找到另一种方法来解析我的数据。如果可以帮助的话,我不想实际创建一个文件。

作为参考,这是我从 HTTPS 网站获得的 XML 数据,上面的代码存储在$t

<?xml version="1.0" ?>
<resultset>
<table name="PROFILE">
 <column name="ID" type="String"/>
 <column name="VERSION" type="String"/>
 <column name="NAME" type="String"/>
 <column name="DESCRIPTION" type="String"/>
<data>
<r><c>0</c><c>1.0</c><c>Default profile</c><c>Default profile</c></r>
<r><c>2</c><c>1.2</c><c>Custom 2</c><c></c></r>
<r><c>3</c><c>6.0</c><c>Custom 3</c><c></c></r>
<r><c>1</c><c>1.15</c><c> For Compare</c><c>The built in profile for compare.</c></r>
<r><c>4</c><c>1.3</c><c>Custom 4</c><c> </c></r>
<r><c>6</c><c>11.0</c><c>Custom 6</c><c>Please only make approved changes.</c></r>
</data>
</table>
</resultset>

任何帮助表示赞赏,谢谢。

4

2 回答 2

3

只需阅读 的文档XML::LibXML,您就会看到调用它的替代形式。

use XML::LibXML;
my $dom = XML::LibXML->load_xml(string => $t);
于 2014-03-21T21:25:42.917 回答
2

如果您查看文档,XML::LibXML::Parser您会发现locationfor 的选项load_xml可以是文件路径或 URL。所以根本不需要直接参与LWP;你可以只写

my $xmldoc = XML::LibXML->load_xml(location => 'https:<mywebsite>');
于 2014-03-22T00:38:42.637 回答