2

Logsという名前のフォルダーがあります。このフォルダーには、Run 1、Run 1(1)、Run 2(2)などのフォルダーがいくつか含まれています。これらの各フォルダーには、解析する必要のあるplistファイルが含まれています。しかし、ファイルを開くことができません。私は以下のコードを実行しています:

my $count = 0;
my $path  = "Logs/";

for my $file (glob("${path}*/*Results.plist")) {

    # initialize parser object and find insances of Fail
    my $xp      = XML::XPath->new(filename=>$file);
    my @nodeset = $xp->find('/dict/array/dict/string[1]');

    foreach my $element (@nodeset){

        if ($element->string_value == "Fail") {

            $count++;
        }
    }
}

print $count;

編集:「文字列」の子ノードで「失敗」を探す必要があります。plistファイルには4つの失敗がありますが、現在のコードは2つしか返していません。

plistファイルの構造は次のとおりです。

<plist version="1.0">
<dict>
<key>All Samples</key>
<array>
<dict>
    <key>LogType</key>
    <string>Fail</string>
    <key>Message</key>
    <string>Text</string>
    <key>Timestamp</key>
    <date>2012-10-17T08:01:51Z</date>
    <key>Type</key>
    <integer>4</integer>
</dict>
<dict>
    <key>LogType</key>
    <string>Fail</string>
    <key>Message</key>
    <string>An error occurred while trying to run the script.</string>
    <key>Timestamp</key>
    <date>2012-10-17T08:20:46Z</date>
    <key>Type</key>
    <integer>7</integer>
</dict>
<dict>
    <key>LogType</key>
    <string>Pass</string>
    <key>Message</key>
    <string></string>
    <key>Timestamp</key>
    <date>2012-10-17T08:01:51Z</date>
    <key>Type</key>
    <integer>5</integer>
</dict>
</array>
</dict>
</plist>
4

2 に答える 2

2

コードにはいくつかの問題があります。

  1. find() メソッドは、配列ではなく XML::XPath::NodeSet オブジェクトを返します
  2. XPath 式が正しくありません。
  3. 要素の文字列値を「Fail」文字列と比較するには、「==」ではなく「eq」を使用する必要があります

これがどのように見えるかです:

my $nodeset = $xp->find('/plist/dict/array/dict/string[1]');
foreach my $element ($nodeset->get_nodelist) {
    if ($element->string_value eq "Fail") {
        $count++;
    }
}

PS: また、「use warnings; use strict;」を使用することをお勧めします。あなたのコードで。

于 2012-10-17T19:52:35.277 に答える
2

これを試して :

use strict; use warnings;
use XML::XPath;

my $path="Logs/";
my $count = 0;

for my $file (glob("${path}*/*Results.plist")){
    my $xp = XML::XPath->new(filename => $file);
    my $nodeset = $xp->find('/plist/dict/array/dict/string[1]/text()');

    foreach my $node ($nodeset->get_nodelist) {
        $count++ if XML::XPath::XMLParser::as_string($node) eq "Fail";
    }
}

print $count;
于 2012-10-17T16:38:22.263 に答える