Я пытаюсь использовать библиотеку DOMDocument, но мне нужен оригинальный текст XML без дальнейших изменений, потому что это подписанный XML с цифровым сертификатом (XMLSecurityKey openssl).
Простые шаги, loadxml и savexml изменяют исходный текст.
Мой код:
$PROCESSED_TEXT = "<node><child>product & ' > < "</child></node>";
$obj = new DOMDocument();
$obj->formatOutput = false; // (needed)
$obj->preserveWhiteSpace = true; // (needed)
$obj->encoding = 'ISO-8859-1'; // (needed)
$obj->loadXML($PROCESSED_TEXT);
$strXMLFinal = $obj->saveXML();
echo $strXMLFinal;
ВЫХОД:
<node><child>producto & ' > < "</child></node>
Мне нужно то же самое:
<node><child>product & ' > < "</child></node>
Я безуспешно пытался с:
$obj->xmlStandalone = true;
$obj->substituteEntities = false;
$obj->resolveExternals = false;
$obj->strictErrorChecking = false;
Любая идея?
Ваш вход и выход точно такой же, как и DOM. Что ваш подписанный вход содержит '
а также "
указывает на то, что используемая процедура подписания неверна. До подписания XML должен быть канонизированный поскольку может быть много одинаково допустимых сериализаций, которые иначе сломали бы подпись XML.
W3C Рекомендация по каноническому XML, раздел 2.3:
Текстовые узлы строковое значение, за исключением того, что все амперсанды заменяются на
&
все открытые угловые скобки (<) заменяются<
все закрывающие угловые скобки (>) заменяются на>
и все символы #xD заменяются на
,
В частности, не учтены '
а также "
быть представленным как '
а также "
,
Единственное место в канонизированном XML вы должны найти "
находится в пределах значения атрибута, и вы нигде не должны найти '
,
Также обратите внимание, что вместо $obj->saveXML()
ты можешь использовать $obj->C14N()
чтобы убедиться, что ваш вывод находится в канонической форме и как таковой будет соответствовать соответствующим подписанным данным.
Если вы не можете получить корректный ввод, ваш единственный вариант — манипулировать строкой XML после сериализации. Как именно это сделать — возможна ли предварительная обработка для маркировки специальных символов и постобработка для их замены; или оптовая замена части вашего вывода исходной строкой ввода — во многом зависит от того, что вы делаете со всем этим в первую очередь.
Других решений пока нет …