1

次のようにファイルを取得しています(インターネットアーカイブから):

<files>
  <file name="Checkmate-theHumanTouch.gif" source="derivative">
    <format>Animated GIF</format>
    <original>Checkmate-theHumanTouch.mp4</original>
    <md5>72ec7fcf240969921e58eabfb3b9d9df</md5>
    <mtime>1274063536</mtime>
    <size>377534</size>
    <crc32>b2df3fc1</crc32>
    <sha1>211a61068db844c44e79a9f71aa9f9d13ff68f1f</sha1>
  </file>
  <file name="CheckmateTheHumanTouch1961.thumbs/Checkmate-theHumanTouch_000001.jpg" source="derivative">
    <format>Thumbnail</format>
    <original>Checkmate-theHumanTouch.mp4</original>
    <md5>6f6b3f8a779ff09f24ee4cd15d4bacd6</md5>
    <mtime>1274063133</mtime>
    <size>1169</size>
    <crc32>657dc153</crc32>
    <sha1>2242516f2dd9fe15c24b86d67f734e5236b05901</sha1>
  </file>
</files>

sはいくつでも持つことができますが<file>、私はサムネイルのものだけを探しています。見つけたらカウンターを増やしたい。ファイル全体を調べたら、真ん中のサムネイルを見つけてname属性を返したいと思います。

ここに私がこれまでに持っているものがあります:

//pop previously retrieved XML file into a variable
$elem = new SimpleXMLElement($xml_file);
//establish variable
$i = 0;

// Look through each parent element in the file
foreach ($elem as $file) {
    if ($file->format == "Thumbnail"){$i++;}
}
    //find the middle thumbnail.
$chosenThumb = ceil(($i/2)-1);
    //Gloriously announce the name of the chosen thumbnail.
echo($elem->file[$chosenThumb]['name']);`

XML 要素を選択する変数を持たないため、最終的なエコーは機能しません。これをハードコーディングすると問題なく動作します。私が XML ファイルを扱うのは初めてだと思いますか?

編集:以下からのFrancis Avilaの答えは、私をすぐに分類しました!:

$sxe = simplexml_load_file($url);
$thumbs = $sxe->xpath('/files/file[format="Thumbnail"]');
$n_thumbs = count($thumbs);
$middlethumb = $thumbs[(int) ($n_thumbs/2)];
$happy_string = (string)$middlethumb[name];
echo $happy_string;
4

3 に答える 3

5

XPath を使用します。

$sxe = simplexml_load_file($url);
$thumbs = $sxe->xpath('/files/file[format="Thumbnail"]');
$n_thumbs = count($thumbs);
$middlethumb = $thumbs[(int) ($n_thumbs/2)];
$middlethumbname = (string) $middlethumb['name'];

合計数が必要ない場合は、単一の XPath 式でこれを達成することもできます。

$thumbs = $sxe->xpath('/files/file[format="Thumbnail"][position() = floor(count(*) div 2)]/@name');
$middlethumbname = (count($thumbs)) ? $thumbs[0]['name'] : '';

SimpleXML の xpath メソッドの制限は、単純型ではなくノードのみを返すことができることです。これが、を使用する必要がある理由です$thumbs[0]['name']。を使用する場合DOMXPath::evaluate()は、代わりにこれを実行できます。

$doc = new DOMDocument();
$doc->loadXMLFile($url);
$xp = new DOMXPath($doc);
$middlethumbname = $xp->evaluate('string(/files/file[format="Thumbnail"][position() = floor(count(*) div 2)]/@name)');
于 2012-04-16T04:32:46.147 に答える
0

いくつかの問題:

  • 中央のサムネイルが正しく計算されていません。これらの親指用に別の配列を保持し、を使用して中央の配列を取得する必要がありますcount
  • fileする必要があるかもしれませんが{'file'}、PHPがこれをどのように認識しているかはわかりません。
  • デフォルトのサムネイルがありません
  • 使用する必要のあるコードは次のとおりです。

    $files = new SimpleXMLElement($xml_file);
    $thumbs = array();
    
    foreach($files as $file)
        if($file->format == "Thumbnail")
            $thumbs[] = $file;
    
    $chosenThumb = ceil((count($thumbs)/2)-1);
    echo (count($thumbs)===0) ? 'default-thumbnail.png' : $thumbs[$chosenThumb]['name'];
    

/ edit:しかし、XPathを使用するというその人の解決策をお勧めします。ずっと簡単です。

于 2012-04-16T04:37:50.663 に答える
0

$elem->file[$chosenThumb]$chosenThumbフィルタリングされた(サムネイル用の)ファイル[]ではなく、メインファイル[]の「番目の要素」を提供しますよね?

foreach ($elem as $file) {
    if ($file->format == "Thumbnail"){
    $i++;
    //add this item to a new array($filteredFiles)
    }
}

$chosenThumb = ceil(($i/2)-1);

//echo($elem->file[$chosenThumb]['name']);
  echo($filteredFiles[$chosenThumb]['name']);
于 2012-04-16T04:28:02.590 に答える