2

ここでは完全に初心者なので、事前に無知で申し訳ありません。

私が検索したりいじったりしたことのほとんどはXML::LibXML、XPath を使用することに集中していました。

私が抱えている問題は、タグ間のテキストをキャプチャしようとしていないことです。タグの値が必要です。

これは私のXML構造です

<users>
  <entry name="asd">
    <permissions>
      <role-based>
        <superuser>yes</superuser>
      </role-based>
    </permissions>
  </entry>
  <entry name="fgh">
    <permissions>
      <role-based>
        <superuser>yes</superuser>
      </role-based>
    </permissions>
    <authentication-profile>RSA Two-Factor</authentication-profile>
  </entry>
  <entry name="jkl">
    <permissions>
      <role-based>
        <superreader>yes</superreader>
      </role-based>
    </permissions>
    <authentication-profile>RSA Two-Factor</authentication-profile>
  </entry>
</users>

name 属性を (引用符なしで) 取得し、この人物がスーパーユーザーかスーパーリーダーかを判断しようとしています。

ノードを印刷する以外に多くのことができないことに行き詰まっています。これをユーザー名の構造の CSV ファイルに変換する必要があります。役割

4

4 に答える 4

2

XML::ルールの使用:

use XML::Rules;

print "name is_superuser is_superreader\n";
my @rules = (
  entry => sub {
    my $entry = $_[1];
    $_ ||= 'no' for @$entry{qw(superuser superreader)};
    print "$entry->{name} $entry->{superuser} $entry->{superreader}\n";
  },
  'permissions,role-based' => 'pass no content',
  'superuser,superreader' => 'content',
  _default => undef,
);

my $p = XML::Rules->new(rules => \@rules);
my $s = $p->parse(doc());

sub doc {
return <<XML;
<users>
   <entry name="asd">
       <permissions>
            <role-based>
                <superuser>yes</superuser>
            </role-based>
       </permissions>
   </entry>
   <entry name="fgh">
       <permissions>
            <role-based>
                <superuser>yes</superuser>
            </role-based>
       </permissions>
       <authentication-profile>RSA Two-Factor</authentication-profile>
   </entry>
   <entry name="jkl">
       <permissions>
            <role-based>
                <superreader>yes</superreader>
            </role-based>
       </permissions>
       <authentication-profile>RSA Two-Factor</authentication-profile>
   </entry>
</users>
XML
}

または、キー フィールドのすべてのコンテンツが「はい」(およびその他のいくつかの仮定) であると仮定したオプションのルール セット:

my $name;
my @rules = (
  '^entry' => sub {
    $name = $_[1]->{name};
  },
  'superuser,superreader' => sub {
    print "$name,$_[0]\n";
  },
  _default => undef,
);
于 2013-10-17T22:18:21.117 に答える
1

XML::Simpleこのようなプロジェクトに使用するのが好きです。

例えば:

use XML::Simple;

my $su = $ARGV[0];
die unless (-e $su);

my $su_xml = XMLin($su, ForceArray => [ 'entry' ]);
my $suref = $su_xml->{entry};

foreach my $key (keys %{$suref}) {
    $rb = ${$suref}{$key}->{permissions}->{'role-based'};
    foreach my $rbkey (keys %{$rb}) {
        print "$key\t$rbkey\t${$rb}{$rbkey}\n";
    }
}

プリント:

fgh     superuser       yes
asd     superuser       yes
jkl     superreader     yes
于 2013-10-17T19:10:29.850 に答える