【问题标题】:XML Data Cleanup Before Calling SimpleXML调用 SimpleXML 之前的 XML 数据清理
【发布时间】:2013-01-09 13:45:05
【问题描述】:

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

该服务找到看起来像具有 XML 的 POST var,然后使用 simplexml_load_string 加载它。似乎只要数据中有引号,例如 this is a "test" 或 this
Customer's Serial Number 加载失败。

我的问题是在调用 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 中查找 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 元素中未经处理的数据引起的。为了纠正这个问题,我添加了 htmlspecialchars():

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

【问题讨论】:

  • 它可能是也可能不是导致您的问题的原因,但请注意 magic_quotes_gpc 不应打开,并且应重写代码以执行正确的转义,而不是依赖此软糖。该功能在 PHP 5.3 中被正式弃用,并在 5.4 中被删除。见php.net/manual/en/security.magicquotes.php
  • 谢谢。通过 htmlspecialchars() 运行 post 值解决了这个特殊问题。元素数据中有非法字符,所以 SimpleXML 令人窒息

标签: php simplexml


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 2023-03-21
    • 2018-05-10
    • 2013-08-21
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多