这应该很简单,但它一直在逃避我。我们有一个用 PHP 编写的 Web 服务,它解析作为 POST 传入的 XML 有效负载,因此 XML 有效负载包含在 $_POST 变量中。
该服务找到看起来像具有 XML 的 POST var,然后使用 simplexml_load_string 加载它。似乎只要数据中有引号,例如<element>this is a "test"</element>或此
<BuyerItemDesc>Customer's Serial Number</BuyerItemDesc>
,加载就会失败。
我的问题是在调用 simplexml_load_string() 之前清理 POST 中的数据的最佳方法是什么?我知道 PHP 正在对 $_POST vars 中的引号进行转义:
magic_quotes_gpc 开 开
magic_quotes_runtime 关 关
但是这种方法似乎并不能解决它:
trim(stripslashes($xmlFromPost));
问题中的 XML 片段
<Item>
<POLineNbr>1</POLineNbr>
<BuyerItemId>CDL-BM01</BuyerItemId>
<BuyerItemDesc>Biscuit Miller's, "Blues with a..."</BuyerItemDesc>
<Qty>1</Qty>
<QtyUOM>EA</QtyUOM>
<UCValue>0.00</UCValue>
<UCCurrencyCode>USD</UCCurrencyCode>
<SupplierItemId></SupplierItemId>
<BarCodeId>884502780246</BarCodeId>
<BarCodeType>GTIN-12</BarCodeType>
在 $_POST if(isset($_POST)){
foreach($_POST as $k=>$v){
if(preg_match('/^\<\?xml/',trim($v))){
$postXMLPayload = trim(stripslashes($v));
break;
}
}
}
libxml_use_internal_errors(true);
$xml = simplexml_load_string($postXMLPayload);
错误
标签 BuyerItemDesc 行 79中
的
数据
过早
结束
更新 这是由 XML 元素中的未经处理的数据引起的。为了纠正这个问题,我添加了 htmlspecialchars():
$payload = htmlspecialchars(stripslashes(trim($postXMLPayload)));