调用SimpleXML之前的XML数据清理

2022-04-13 00:00:00 php simplexml

这应该很简单,但我一直回避这一点。我们有一个用PHP编写的Web服务,它解析作为POST传入的XML有效负载,因此该XML有效负载包含在$_POST变量中。

该服务找到看起来像是具有XML的POST变量,然后使用implexml_LOAD_STRING加载它。似乎只要数据中有引号,如<;Element>;这就是"测试"<;/Element>;或
<;BuyerItemDesc&>客户序列号<;/BuyerItemDesc&> 加载失败。

我的问题是,在调用implexml_Load_String()之前,清理POST中的数据的最佳方法是什么?我知道PHP正在对$_POST vars:

中的引号进行转义

启用MAGIC_QUOTES_GPC
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 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行数据过早结束
标签项目第76行数据过早结束
标签项目第75行中的数据过早结束
标记PODetail行74中的数据过早结束
标记NAMM_PO行2中的数据过早结束

更新 这是由XML元素中未经清理的数据引起的。为了纠正这个错误,我添加了htmlSpecial alchars():

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

解决方案

这是由xml元素中未经清理的数据引起的。为了纠正这个错误,我添加了htmlSpecial alchars():

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

相关文章