XML显示从某些类别的PHP点头

时间:2014-12-11 06:27:22

标签: php xml file

我有一个看起来像那个的xml文件:

<response>

<books>
<link>http:/www.website.com/linktobook/1.html</link>
<title>Book Title 1</title>
<image>http:/www.website.com/linktobook/1.jpg</image>
<category>b</category>
</books>

<books>
<link>http:/www.website.com/musicdvd/2.html</link>
<title>Music DVD 1</title>
<image>http:/www.website.com/musicdvd/2.jpg</image>
<category>m</category>
</books>

<books>
<link>http:/www.website.com/linktobook/3.html</link>
<title>Book Title 3</title>
<image>http:/www.website.com/linktobook/3.jpg</image>
<category>b</category>
</books>

</response>

我想做的是在for循环中生成文件(这是有效的),但仅适用于某些类别的节点(在此示例中,类别为“b”作为书籍)。

这是我的PHP脚本:

<?php
$html = "";
$url = "http://website.com/feed.xml";
$xml = simplexml_load_file($url);
    for($i = 0; $i < 10; $i++){
    ${"file$i"} = "file$i.php";
    $cat = $xml->books[$i]->category;
        if ($cat == "b") {
        $link = $xml->books[$i]->link;
        $title = $xml->books[$i]->title;
        $html .= "<a href=\"$link\">$title</a>";
        file_put_contents(${"file$i"}, $html);
        } else { 
        $i--;
        }
    }
?>

现在file0.php没问题,看起来像这样:

<a href="http:/www.website.com/linktobook/1.html">Book Title 1</a>

但是file1.php有2个节点,看起来像这样:

<a href="http:/www.website.com/linktobook/1.html">Book Title 1</a>
<a href="http:/www.website.com/linktobook/2.html">Book Title 2</a>

file2.php看起来像这样:

<a href="http:/www.website.com/linktobook/1.html">Book Title 1</a>
<a href="http:/www.website.com/linktobook/2.html">Book Title 2</a>
<a href="http:/www.website.com/linktobook/3.html">Book Title 3</a>

等等。但是我想在每个文件中只有一个节点。

这应该是这样的:

file0.php:

<a href="http:/www.website.com/linktobook/0.html">Book Title 0</a>

file1.php:

<a href="http:/www.website.com/linktobook/1.html">Book Title 1</a>

file2.php:

<a href="http:/www.website.com/linktobook/2.html">Book Title 2</a>

等等到file9.php:

<a href="http:/www.website.com/linktobook/9.html">Book Title 9</a>

3 个答案:

答案 0 :(得分:0)

如果您只想在每个文件中添加一个项目,请在此处删除连接:$html .= "<a href=\"$link\">$title</a>";

答案 1 :(得分:0)

<?php
$url = "http://website.com/feed.xml";
$num=0;
if ($xml = simplexml_load_file($url)) {
    echo $xml->count();
    for ($i = 0; $i < $xml->count(); $i++) {
        $html = "";
        ${"file$num"} = "file$num.php";
        $cat = $xml->books[$i]->category;
        if ($cat == "b") {
            $link = $xml->books[$i]->link;
            $title = $xml->books[$i]->title;
            $html .= "<a href=\"$link\">$title</a>";
            file_put_contents(${"file$num"}, $html);
            $num++;
        }        
    }
}
?>

答案 2 :(得分:0)

您可以使用XPath从DOM文档中获取特定节点。

DOM

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);

foreach ($xpath->evaluate('/response/books[category = "b"]') as $index => $node) {
  echo $index, "\n-----------\n";
  printf(
    '<a href="%s">%s</a>',
    htmlspecialchars($xpath->evaluate('string(link)', $node)),
    htmlspecialchars($xpath->evaluate('string(title)', $node))
  );
  echo "\n\n";
}

SimpleXML的:

$response = simplexml_load_string($xml);

foreach ($response->xpath('books[category = "b"]') as $index => $books) {
  echo $index, "\n-----------\n";
  printf(
    '<a href="%s">%s</a>',
    htmlspecialchars($books->link),
    htmlspecialchars($books->title)
  );
  echo "\n\n";
}

输出:

0
-----------
<a href="http:/www.website.com/linktobook/1.html">Book Title 1</a>

1
-----------
<a href="http:/www.website.com/linktobook/3.html">Book Title 3</a>

警告!

不要忘记将您放入HTML的数据转义。你正在生成PHP文件。这意味着将由浏览器执行的源代码。非转义允许从数据文件中注入PHP源代码。如果你正在编写PHP文件,你需要非常小心。如果可能,编写HTML / XML文件并使用readfile()(不是include())。这样,PHP将动态文件作为文本处理,您只需要关心浏览器。