调用SimpleXML之前的XML数据清理

时间:2013-01-09 13:45:06

标签: php simplexml

这应该很简单,但它一直在逃避我。我们有一个用PHP编写的Web服务,它解析以POST形式出现的XML有效负载,因此XML有效负载包含在$ _POST变量中。

该服务找到看起来像XML的POST var,然后使用simplexml_load_string加载它。似乎每当数据中有引号如< element>这就是“测试”< / element> 或者这个
< BuyerItemDesc>客户的序列号< / BuyerItemDesc> 负载失败。

我的问题是在调用simplexml_load_string()之前,在POST中清理数据的最佳方法是什么?我知道PHP正在对$ _POST vars中的引号进行一些转义:

magic_quotes_gpc On On magic_quotes_runtime Off Off

但这种方法似乎并没有解决它:

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 中查找XML      如果(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行中的数据提前结束 标签项目行76中数据的过早结束 标签项目行75的数据提前结束 标签PODetail line 74中数据的过早结束 标签NAMM_PO第2行中的数据提前结束

更新 这是由XML元素中的未经过数据处理的数据引起的。为了纠正这个问题,我添加了htmlspecialchars():

$payload = htmlspecialchars(stripslashes(trim($postXMLPayload)));

1 个答案:

答案 0 :(得分:0)

这是由XML元素中的未经过数据处理的数据引起的。为了纠正这个问题,我添加了htmlspecialchars():

$payload = htmlspecialchars(stripslashes(trim($postXMLPayload)));