1

Articulate eLearning コース (imsmanifest.xml) の XML マニフェスト ファイルを解析しようとしています。

XML 構造の抜粋を以下に示します (adlcp:masteryscore にドリルダウンしようとしています)。

<?xml version="1.0" encoding="UTF-8"?>
<manifest xsi:schemaLocation="http://www.imsproject.org/xsd/imscp_rootv1p1p2 imscp_rootv1p1p2.xsd http://www.imsglobal.org/xsd/imsmd_rootv1p2p1 imsmd_rootv1p2p1.xsd http://www.adlnet.org/xsd/adlcp_rootv1p2 adlcp_rootv1p2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2" xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2" version="1.0" identifier="Electrical_Design_Part_3">
    <metadata/>
    <organizations default="Electrical_Design_Part_3_ORG">
      <organization identifier="Electrical_Design_Part_3_ORG">
        <title>Electrical Design - Part 3</title>
        <item identifier="Electrical_Design_Part_3_SCO" identifierref="Articulate_Presenter_RES" isvisible="true">
          <title>Electrical Design - Part 3</title>
          <adlcp:masteryscore>65</adlcp:masteryscore>
        </item>
      </organization>
    </organizations>
    <resources/>
</manifest>

XML::Simple と XML::LibXML を使ってみました。これらのモジュールをより単純な XML ファイルで正常に動作させることはできますが、実際に解析する必要があるマニフェスト ファイルでは動作しません。

次のコードは、XML::LibXML を使用してタイトル タグにドリル ダウンする試みを示しています。

use XML::LibXML;
$filename = "imsmanifest.xml";
$parser = XML::LibXML->new();
$xmldoc = $parser->parse_file($filename);

for my $sample ($xmldoc->findnodes('/manifest/organizations/organization/item/title')) {
    for my $property ($sample->findnodes('./*')) {
        print $property->nodeName(), ": ", $property->textContent(), "\n";
    }
    print "\n"; 
};

adlcp:masteryscore タグのコロンをどのように処理しますか? これを使用しようとすると、エラーが発生しますが、正しく実行していない可能性があります。

adlcp:masteryscore にドリルダウンする正しい方法を教えてください。

どうもありがとうございました。

4

3 に答える 3

4

manifestnull 名前空間で名前が付けられた要素を見つけようとしていますが、名前空間で名前が付けられmanifestた要素が必要ですhttp://www.imsproject.org/xsd/imscp_rootv1p1p2

修正:

use strict;
use warnings;

use XML::LibXML               qw( );
use XML::LibXML::XPathContext qw( );

my $xml_qfn = 'imsmanifest.xml';

my $parser = XML::LibXML->new( no_network => 1 );
my $doc = $parser->parse_file($xml_qfn);

my $xpc = XML::LibXML::XPathContext->new();
$xpc->registerNs( a => "http://www.adlnet.org/xsd/adlcp_rootv1p2" );
$xpc->registerNs( i => "http://www.imsproject.org/xsd/imscp_rootv1p1p2" );

for my $item ($xpc->findnodes('/i:manifest/i:organizations/i:organization/i:item', $doc)) {
    my $title   = $xpc->find('i:title/text()', $item);
    my $mastery = $xpc->find('a:masteryscore/text()', $item);
    print "$title: $mastery\n"; 
}

注: XPath で使用するプレフィックス (aおよびi) の実際の選択は任意です。XML ドキュメントを作成するときと同じように、必要なものを選択できます。

注: no_network => 1XML ドキュメントを解析するたびに libxml が DTD をフェッチしないようにするために追加しました。

于 2013-03-29T23:01:21.113 に答える
0

ステップ1、適切に形成されたxmlになるように例を修正します

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2" xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2" xsi:schemaLocation="http://www.imsproject.org/xsd/imscp_rootv1p1p2 imscp_rootv1p1p2.xsd http://www.imsglobal.org/xsd/imsmd_rootv1p2p1 imsmd_rootv1p2p1.xsd http://www.adlnet.org/xsd/adlcp_rootv1p2 adlcp_rootv1p2.xsd" version="1.0" identifier="Electrical_Design_Part_3">
    <metadata>
    <organizations default="Electrical_Design_Part_3_ORG">
      <organization identifier="Electrical_Design_Part_3_ORG">
        <title>Electrical Design - Part 3</title>
        <item identifier="Electrical_Design_Part_3_SCO" identifierref="Articulate_Presenter_RES" isvisible="true">
          <title>Electrical Design - Part 3</title>
          <adlcp:masteryscore>65</adlcp:masteryscore>
        </item>
      </organization>
    </organizations>
    <resources/>
</metadata>
</manifest>

perl デバッガーを起動する

DB<2> use XML::Simple

  DB<3> $x=XMLin("example.xml")

  DB<4> x $x
0  HASH(0x2733c48)
   'identifier' => 'Electrical_Design_Part_3'
   'metadata' => HASH(0x2733828)
      'organizations' => HASH(0x2733288)
         'default' => 'Electrical_Design_Part_3_ORG'
         'organization' => HASH(0x272d7e8)
            'identifier' => 'Electrical_Design_Part_3_ORG'
            'item' => HASH(0x27285f8)
               'adlcp:masteryscore' => 65
               'identifier' => 'Electrical_Design_Part_3_SCO'
               'identifierref' => 'Articulate_Presenter_RES'
               'isvisible' => 'true'
               'title' => 'Electrical Design - Part 3'
            'title' => 'Electrical Design - Part 3'
      'resources' => HASH(0x27333d8)
           empty hash
   'version' => 1.0
   'xmlns' => 'http://www.imsproject.org/xsd/imscp_rootv1p1p2'
   'xmlns:adlcp' => 'http://www.adlnet.org/xsd/adlcp_rootv1p2'
   'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
   'xsi:schemaLocation' => 'http://www.imsproject.org/xsd/imscp_rootv1p1p2 imscp_rootv1p1p2.xsd http://www.imsglobal.org/xsd/imsmd_rootv1p2p1 imsmd_rootv1p2p1.xsd http://www.adlnet.org/xsd/adlcp_rootv1p2 adlcp_rootv1p2.xsd'

  DB<6> x keys %$x
0  'xmlns'
1  'xmlns:xsi'
2  'identifier'
3  'version'
4  'metadata'
5  'xsi:schemaLocation'
6  'xmlns:adlcp'
  DB<9> x keys %{$x->{metadata}}
0  'resources'
1  'organizations'
  DB<10> x keys %{$x->{metadata}{organizations}}
0  'default'
1  'organization'
  DB<11> x keys %{$x->{metadata}{organizations}{organizations}
Missing right curly or square bracket at (eval 22)[/usr/share/perl/5.14/perl5db.pl:640] line 4, at end of line
syntax error at (eval 22)[/usr/share/perl/5.14/perl5db.pl:640] line 4, at EOF
  DB<12> x keys %{$x->{metadata}{organizations}{organizations}}
  empty array
  DB<13> x keys %{$x->{metadata}{organizations}{organization}}
0  'identifier'
1  'item'
2  'title'
  DB<14> x keys %{$x->{metadata}{organizations}{organization}{item}}
0  'identifier'
1  'identifierref'
2  'isvisible'
3  'title'
4  'adlcp:masteryscore'
  DB<19> x $x->{metadata}{organizations}{organization}{item}{'adlcp:masteryscore'}
0  65
  DB<20> 

だからあなたがしなければならないのは

use XML::Simple;
$x=XMLIN("example.xml");
print $x->{metadata}{organizations}{organization}{item}{'adlcp:masteryscore'};

お役に立てれば

于 2013-03-29T21:46:59.240 に答える
0

xml が無効です。タグのメタデータとリソースを閉じる必要があります

その後、XML::Simple はこのコードで動作します

#!/usr/bin/env perl 

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;


use XML::Simple qw(:strict);

my $ref = XMLin('test.xml',ForceArray => [], KeyAttr => {});
print STDERR Dumper $ref;
于 2013-03-29T21:47:44.260 に答える