Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 无法访问PERL中的所有XML元素_Arrays_Xml_Perl_Parsing - Fatal编程技术网

Arrays 无法访问PERL中的所有XML元素

Arrays 无法访问PERL中的所有XML元素,arrays,xml,perl,parsing,Arrays,Xml,Perl,Parsing,我有一个简单的Perl脚本,可以解析从服务器下载的XML文件。唯一的问题是,我制作的数组似乎只存储第一组标记 这是我的密码: sub test_button_func() { $ua->cookie_jar($cookie_jar); # Now make your request my $server_endpoint = "server_url_link"; $server_endpoint =~ s/\%id\%/$user/g; # set custom HTTP reque

我有一个简单的Perl脚本,可以解析从服务器下载的XML文件。唯一的问题是,我制作的数组似乎只存储第一组标记

这是我的密码:

sub test_button_func() {

$ua->cookie_jar($cookie_jar);
# Now make your request

my $server_endpoint = "server_url_link";
$server_endpoint =~ s/\%id\%/$user/g;

# set custom HTTP request header fields
my $req = HTTP::Request->new(GET => $server_endpoint);
$req->header('content-type' => 'application/json');

my $parser = shift;
my $resp = $ua->request($req);

if ($resp->is_success) {

    # XML response received from Jazz API.
    my $message = $resp->decoded_content;

    # Parse the XML downloaded here:
    # create object
    my $xml = new XML::Simple;

    # Read XML file
    my @data = $xml->XMLin($message);
    my $arraySize = scalar (@data);

    # Print out the data we need
    for (my $num = 0; $num <= ($arraySize - 1); $num++) {
        print @data[0]->{'oslc_disc:entry'}[$num]{'oslc_disc:ServiceProvider'}{'dc:title'};
        print "\n";
    }
}

else {
    print "HTTP GET error code: ", $resp->code, "\n";
    print "HTTP GET error message: ", $resp->message, "\n";
    print $resp->decoded_content;
}
}
我尝试解析的XML如下所示:

<oslc_disc:entry>

<oslc_disc:ServiceProvider>

    <dc:title>URL MAIN TITLE</dc:title>
    <oslc_disc:details rdf:resource="URL LINK"/>
    <oslc_disc:services rdf:resource="URL LINK"/>
    <jfs_proc:consumerRegistry rdf:resource="URL LINK"/>

</oslc_disc:ServiceProvider>

</oslc_disc:entry>
所以我的观点是,我可以解析第一个oslc_光盘条目。但是在XML文件中有不止一个。如何解析其余部分?

不要使用XML库解析RDF。它会给你带来痛苦的世界

另外,永远不要将XML::Simple用于任何事情

是Perl中RDF的最新技术。是为了取代它而编写的,重量更轻,应该提供更好的API,但还没有真正准备好

使用RDF::Trine的示例 使用Attean的示例 我还没有太多使用Attean,所以可能有更优雅的方法来实现这一点

use strict;
use warnings;
use Attean::RDF qw(iri);

# $base is for resolving any relative URLs.
my $base = 'http://example.com/';

# Parse the data into $model
my $store  = Attean->get_store('Memory')->new;
my $model  = Attean::MutableQuadModel->new( store => $store );
my $data   = do { local $/; <DATA> };  # slurp filehandle into string
$model->load_triples(RDFXML => iri($base), $data);

# Some namespaces for querying the data...
my $oslc = 'http://open-services.net/xmlns/discovery/1.0/';
my $dc   = 'http://purl.org/dc/terms/';

# Cycle through the objects of oscl_disc:entry
for my $provider ( $model->objects(undef, iri("${oslc}entry"))->elements ) {

    # Get the title. This returns a list of titles, so we call
    # it in list context and get just the first result.
    my ($title) = $model->objects($provider, iri("${dc}title"))->elements;

    # Print it.
    print "GOT: ", $title->value, "\n";
}

__DATA__
<oslc_disc:ServiceProviderCatalog
    xmlns:oslc_disc="http://open-services.net/xmlns/discovery/1.0/"
    xmlns:dc="http://purl.org/dc/terms/"
    xmlns:jfs_proc="https://jazz.net/xmlns/prod/jazz/process/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    rdf:about="https://localhost:9443/ccm/oslc-scm/catalog.xml"
>
    <oslc_disc:entry>
        <oslc_disc:ServiceProvider>
            <dc:title>Foo Bar Baz</dc:title>
            <oslc_disc:details rdf:resource="foo"/>
            <oslc_disc:services rdf:resource="bar"/>
            <jfs_proc:consumerRegistry rdf:resource="baz"/>
        </oslc_disc:ServiceProvider>
    </oslc_disc:entry>
    <oslc_disc:entry>
        <oslc_disc:ServiceProvider dc:title="Foo Bar Baz II">
            <oslc_disc:details rdf:resource="foo2"/>
            <oslc_disc:services rdf:resource="bar2"/>
            <jfs_proc:consumerRegistry rdf:resource="baz2"/>
        </oslc_disc:ServiceProvider>
    </oslc_disc:entry>
</oslc_disc:ServiceProviderCatalog>
不要使用XML库来解析RDF。它会给你带来痛苦的世界

另外,永远不要将XML::Simple用于任何事情

是Perl中RDF的最新技术。是为了取代它而编写的,重量更轻,应该提供更好的API,但还没有真正准备好

使用RDF::Trine的示例 使用Attean的示例 我还没有太多使用Attean,所以可能有更优雅的方法来实现这一点

use strict;
use warnings;
use Attean::RDF qw(iri);

# $base is for resolving any relative URLs.
my $base = 'http://example.com/';

# Parse the data into $model
my $store  = Attean->get_store('Memory')->new;
my $model  = Attean::MutableQuadModel->new( store => $store );
my $data   = do { local $/; <DATA> };  # slurp filehandle into string
$model->load_triples(RDFXML => iri($base), $data);

# Some namespaces for querying the data...
my $oslc = 'http://open-services.net/xmlns/discovery/1.0/';
my $dc   = 'http://purl.org/dc/terms/';

# Cycle through the objects of oscl_disc:entry
for my $provider ( $model->objects(undef, iri("${oslc}entry"))->elements ) {

    # Get the title. This returns a list of titles, so we call
    # it in list context and get just the first result.
    my ($title) = $model->objects($provider, iri("${dc}title"))->elements;

    # Print it.
    print "GOT: ", $title->value, "\n";
}

__DATA__
<oslc_disc:ServiceProviderCatalog
    xmlns:oslc_disc="http://open-services.net/xmlns/discovery/1.0/"
    xmlns:dc="http://purl.org/dc/terms/"
    xmlns:jfs_proc="https://jazz.net/xmlns/prod/jazz/process/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    rdf:about="https://localhost:9443/ccm/oslc-scm/catalog.xml"
>
    <oslc_disc:entry>
        <oslc_disc:ServiceProvider>
            <dc:title>Foo Bar Baz</dc:title>
            <oslc_disc:details rdf:resource="foo"/>
            <oslc_disc:services rdf:resource="bar"/>
            <jfs_proc:consumerRegistry rdf:resource="baz"/>
        </oslc_disc:ServiceProvider>
    </oslc_disc:entry>
    <oslc_disc:entry>
        <oslc_disc:ServiceProvider dc:title="Foo Bar Baz II">
            <oslc_disc:details rdf:resource="foo2"/>
            <oslc_disc:services rdf:resource="bar2"/>
            <jfs_proc:consumerRegistry rdf:resource="baz2"/>
        </oslc_disc:ServiceProvider>
    </oslc_disc:entry>
</oslc_disc:ServiceProviderCatalog>

的文档告诉您不要使用。的文档告诉您不要使用。您好,谢谢您的回复。我真的很感激。我将试用你的代码,并尝试一下,看看我能做些什么。我还要问一下perl程序末尾的数据位是什么。很多perl脚本都看到了这一点。对不起,我是perl noob。如果perl脚本以_DATA和一些数据结尾,那么在脚本中可以使用一个名为*DATA的特殊文件句柄,这将允许您在脚本结尾访问该数据。这对于在同一个文件中提供脚本和输入数据非常方便。非常感谢您的帮助。我会尽我最大的努力和你的代码打交道,以便更好地了解我在做什么。谢谢。嗨,谢谢你的回复。我真的很感激。我将试用你的代码,并尝试一下,看看我能做些什么。我还要问一下perl程序末尾的数据位是什么。很多perl脚本都看到了这一点。对不起,我是perl noob。如果perl脚本以_DATA和一些数据结尾,那么在脚本中可以使用一个名为*DATA的特殊文件句柄,这将允许您在脚本结尾访问该数据。这对于在同一个文件中提供脚本和输入数据非常方便。非常感谢您的帮助。我会尽我最大的努力和你的代码打交道,以便更好地了解我在做什么。谢谢