56

这是我的代码:

<?php
// 27/01/2016 Edit:
$result = mysql_query("A Long mysql query");
$rss = new SimpleXMLElement('<rss version="2.0" />');
$products = $rss->addChild('products');
///
while($row = mysql_fetch_array($result)){
$product = $products->addChild('category');
$product->addChild('product_id',"$row[product_id]");
$product->addChild('cat_id',"$row[cat_id]");
$product->addChild('cat_name',"$row[cat_name]");
$product->addchild('product_code',"$row[product_code]");
$product->addchild('product_name',"$row[product_name]");
$product->addChild('description','$row[description]');
$product->addchild('rating',"$row[rating]");
$product->addchild('image_url','$row[imag_url]');
$product->addchild('price',"$row[price]");
$product->addchild('discount',"$row[discount]");
$product->addchild('stock_status',"$row[stock_status]");
$product->addchild('stock_quantity',"$row[stock_quantity]");
$product->addchild('weight',"$row[weight]");
$product->addchild('length',"$row[length]");
$product->addchild('width',"$row[width]");
$product->addchild('height',"$row[height]");
$product->addchild('colour',"$row[colour]");
$product->addchild('size',"$row[size]");
$product->addchild('material',"$row[material]");
$product->addchild('pattern',"$row[pattern]");
};

Header('Content-type: text/xml');
print($rss->asXML());
?>

这是错误:

警告:SimpleXMLElement::addChild() [simplexmlelement.addchild]: 第 40 行 C:\wamp\www\rabwah\core.php 中未终止的实体引用 _Coke.jpg

错误与 一致'$row[imag_url]'

4

7 回答 7

138

这正确地编码了& < >"" ''

$parent->addChild($name, htmlspecialchars($value));
于 2015-04-16T15:22:33.680 回答
45

SimpleXMLElement实际上是一种系统资源,其行为类似于对象。这使得使用循环变得棘手。因此,当尝试添加新的子元素而不是这样时:

$product->addchild('element', $value);

做这个:

$product->element = $value;

或者您可以使用htmlspecialchars(), 转义 html 字符。

笔记:

mysql_*起已弃用,自起已删除。所以改为使用mysqli_*or PDO
为什么我不应该在 PHP 中使用 mysql_* 函数?

于 2013-06-11T11:56:18.357 回答
9

我对此的解决方案是专门创建一个文本节点,以确保绝对正确地转义所有内容:

$cell = $dom->createElement('td');
$cell->appendChild($dom->createTextNode($value));
于 2014-08-17T15:35:15.890 回答
2

如果您使用新创建的节点,您可以通过访问 {0} 属性来设置值。这应该转义任何特殊字符。

$childNode = $parent->addChild($name);
$childNode{0} = $value;
于 2019-03-13T14:16:41.503 回答
1

很抱歉重新提出一个老问题,但还有另一种解决方案。假设以下代码导致“未终止的实体引用”错误:

$xml->addChild($key,$value); 

@Joel-Davey 的解决方案效果很好:

$xml->addChild($key,htmlspecialchars($value)); 

但是,如果出于某种原因不想使用上述 htmlspecialchars 函数,您也可以执行以下操作(基本上,您将一步分为两步):

$xml->addChild($key); 
$xml->$key=$value; 

我不知道哪个会执行得更快;我怀疑它会产生很大的不同,但是,这行得通,我认为应该提到它

PS:我知道它有效,因为我在个人项目中使用它

于 2017-09-12T07:32:18.750 回答
0

尝试改变 -

$product->addchild('image_url','$row[imag_url]');

$product->addchild('image_url',"$row[\"imag_url\"]");

或者

$product->addchild('image_url',$row['imag_url']);

编辑 在 image_url 周围加上引号,由 Barrmar提供

于 2013-06-10T15:12:12.717 回答
0

正确的形式是:

$product->addchild('image_url',htmlspecialchars($row['imag_url']));
于 2017-05-13T08:15:39.473 回答