1

我正在检索这样的文件(来自 Internet 档案):

<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>

它们可以有任意数量的<file>s,而我只是在寻找那些缩略图。当我找到它们时,我想增加一个计数器。当我浏览完整个文件后,我想找到中间的缩略图并返回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

$elem->file[$chosenThumb]将给出$chosenThumb主文件中的第 'th 元素 [] 而不是过滤后的(用于缩略图)文件 [],对吗?

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 回答
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 回答