我有一个看起来像那个的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>
答案 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 = 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";
}
$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将动态文件作为文本处理,您只需要关心浏览器。