此文件应输出一系列连接字符串,如下所示:
"id number" "name of the fruit" "color of the fruit"
但是当我测试它时它只是给我一个空白屏幕,除非我使用var_dump()
来回显信息。此信息来自数据库,并汇总在名为fruitxml.php
的文件中。这是my $contents
变量来自的文件。
即使echo $xml
也没有做任何事情。这应该至少有效。但它并没有。我做错了什么让我一片空白?
<?php
$contents = file_get_contents("http://localhost:8888/SSL/Week3/Activity%203-3/fruitxml.php");
$xml = new SimpleXMLElement($contents);
echo $xml;
foreach($xml->fruits as $fruit) {
echo $fruit->fruitid . $fruit->fruitcolor . $fruit->fruitname . '.<br />';
} ?>
<pre><?php var_dump($xml) ?></pre>
当我使用var_dump()
时,就像我说的那样,我得到的所有信息都是在JSON数组中,而不是我想要的字符串。
object(SimpleXMLElement)#1 (3) {
["fruitid"]=>
array(5) {
[0]=>
object(SimpleXMLElement)#3 (1) {
["id"]=>
string(1) "1"
}
[1]=>
object(SimpleXMLElement)#5 (1) {
["id"]=>
string(1) "4"
}
[2]=>
object(SimpleXMLElement)#8 (1) {
["id"]=>
string(1) "6"
}
[3]=>
object(SimpleXMLElement)#11 (1) {
["id"]=>
string(1) "8"
}
[4]=>
object(SimpleXMLElement)#14 (1) {
["id"]=>
string(1) "9"
}
}
["fruitname"]=>
array(5) {
[0]=>
object(SimpleXMLElement)#2 (1) {
["name"]=>
string(6) "Orange"
}
[1]=>
object(SimpleXMLElement)#6 (1) {
["name"]=>
string(6) "Grapes"
}
[2]=>
object(SimpleXMLElement)#9 (1) {
["name"]=>
string(5) "Apple"
}
[3]=>
object(SimpleXMLElement)#12 (1) {
["name"]=>
string(10) "Grapefruit"
}
[4]=>
object(SimpleXMLElement)#15 (1) {
["name"]=>
string(4) "Lime"
}
}
["fruitcolor"]=>
array(5) {
[0]=>
object(SimpleXMLElement)#4 (1) {
["color"]=>
string(6) "Orange"
}
[1]=>
object(SimpleXMLElement)#7 (1) {
["color"]=>
string(6) "Purple"
}
[2]=>
object(SimpleXMLElement)#10 (1) {
["color"]=>
string(3) "Red"
}
[3]=>
object(SimpleXMLElement)#13 (1) {
["color"]=>
string(14) "Pinkish Orange"
}
[4]=>
object(SimpleXMLElement)#16 (1) {
["color"]=>
string(5) "Green"
}
}
}
这是带有XML的文件,它从数据库中获取信息。
<?php
$dbh = new PDO("mysql:host=localhost;port=8889;dbname=ssl", "root", "root");
$sth = $dbh->prepare('SELECT fruitid, fruitname, fruitcolor FROM fruitapp');
$sth->execute();
$result = $sth->fetchall();
header("Content-type: application/xml");
$xmlfile = '<?xml version="1.0" encoding="UTF-8"?>';
$xmlfile .= "<fruits>";
foreach($result as $user) {
$xmlfile .= '<fruitid>';
$xmlfile .= "<id>" . $user['fruitid'] . "</id>";
$xmlfile .= '</fruitid>';
$xmlfile .= '<fruitname>';
$xmlfile .= "<name>" . $user['fruitname'] . "</name>";
$xmlfile .= '</fruitname>';
$xmlfile .= '<fruitcolor>';
$xmlfile .= "<color>" . $user['fruitcolor'] . "</color>";
$xmlfile .= '</fruitcolor>';
};
$xmlfile .= "</fruits>";
echo $xmlfile;
$dom = new DOMDocument("1.0");
$dom->loadXML($xmlfile);
$dom->save("myfruitxml.xml");
?>
答案 0 :(得分:0)
像这样生成xml:
function escapeXml($input)
{
return htmlspecialchars($input, ENT_XML1, 'UTF-8');
}
$xmlfile = '<?xml version="1.0" encoding="UTF-8"?>';
$xmlfile .= "<fruits>";
foreach($result as $user) {
$xmlfile .= '<fruit>';
$xmlfile .= "<id>" . escapeXml($user['fruitid']) . "</id>";
$xmlfile .= "<name>" . escapeXml($user['fruitname']) . "</name>";
$xmlfile .= "<color>" . escapeXml($user['fruitcolor']) . "</color>";
$xmlfile .= '</fruit>';
};
$xmlfile .= "</fruits>";
输出如下:
foreach($xml->fruit as $fruit) {
echo $fruit->id . $fruit->color . $fruit->name . '.<br />';
}
说明:
文档的根节点由SimpleXmlElement本身表示。所以你不必使用$xml->fruits
。 $xml
已经代表了水果节点。
要访问各个水果,请将它们分别放在<fruit>
节点中。
不需要将水果的属性放在两个嵌套节点中。为每个属性使用单个节点。
使用htmlspecialchars
来转义特殊字符,以便在例如水果名称包含&lt;时没有语法错误。或者&amp;。
//代码未经过测试
答案 1 :(得分:-1)
这主要是因为你使用的是file_get_contents,网址看起来很可疑(因为使用的是8888端口)。
考虑使用CURL,它应该可以工作:
<?php
$curl = curl_init('http://localhost/SSL/Week3/Activity%203-3/fruitxml.php');
curl_setopt($curl, CURLOPT_PORT, 8888);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 8888);
$contents = curl_exec($curl);
$xml = new SimpleXMLElement($contents);
echo $xml;
foreach($xml->fruits as $fruit) {
echo $fruit->fruitid . $fruit->fruitcolor . $fruit->fruitname . '.<br />';
} ?>
<pre><?php var_dump($xml) ?></pre>