Это должно быть просто, но это ускользало от меня. У нас есть веб-сервис, написанный на PHP, который анализирует полезную нагрузку XML, входящую в состав POST, поэтому полезная нагрузка XML содержится в переменной $ _POST.
Служба находит POST var, который похож на XML, а затем использует simplexml_load_string для его загрузки. Кажется, что всякий раз, когда в данных, подобных <element>, есть кавычки, это «тест» </ element> или этот
<BuyerItemDesc> Серийный номер клиента </ BuyerItemDesc> сбой загрузки.
Мой вопрос в том, как лучше всего дезинфицировать данные в POST перед вызовом simplexml_load_string ()? Я знаю, что PHP делает некоторое ускорение кавычек, найденных в $ _POST vars:
magic_quotes_gpc Вкл. 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>
-<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>
-<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>
Ищите XML в $ _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
Преждевременный конец данных в теге Позиция строка 76
Преждевременный конец данных в тегах. Строка 75
Преждевременный конец данных в теге PODetail line 74
Преждевременный конец данных в теге NAMM_PO line 2
ОБНОВЛЕНИЕ Это было вызвано неанитированными данными в элементе XML. Чтобы исправить это, я добавил htmlspecialchars ():
$payload = htmlspecialchars(stripslashes(trim($postXMLPayload)));