У меня проблема с чтением XML в php, отправляемом из базы данных доступа, когда тело содержит &, Когда, когда я получаю контент, который содержит & в теле кажется, что & преобразуется в [«amp; где-то в процессе, и в результате весь xml искажается. Это пример того, что я отправляю и получаю:
xml = "<?xml version='1.0' encoding='utf-8'?><query><author>John Steinbeck</author></query>"
Dim objHTTP As New ServerXMLHTTP60
objHTTP.Open "POST", "http://localhost/sandpit/testxml.php", False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"objHTTP.send "request=" & xml
Файл php — это простой эхо-запрос для тестирования:
<?php echo "<xmp>posted: ";var_dump($_REQUEST);echo "</xmp>"; ?>
Когда тело автора не содержит амперсанд, результат в PHP:
["request"]=>
string(84) "<?xml version='1.0' encoding='utf-8'?><query><author>John
Steinbeck</author></query>"}
Однако, если я изменю строку xml на:
xml = "<?xml version='1.0' encoding='utf-8'?><query><author>John & Steinbeck</author></query>"
результат, который я получаю:
posted: array(2) {
["request"]=>
string(41) "<?xml version='1.0'?><query><author>John "["amp;_Steinbeck</author></query>"]=>
string(0) ""}
Вы можете увидеть выше, что & преобразуется в [‘amp ….
Также попытался использовать CDATA со следующим результатом:
posted: array(2) {
["request"]=>
string(68) "<?xml version='1.0' encoding='utf-8'?><query><author><!
[CDATA[ John "["Steinbeck]]></author></query>"]=>
string(0) ""
}
Кажется все после того, как амперсанд до конца строки xml заключен в [«…»], что портит xml.
Также попытался изменить тип содержимого на text / xml и application / xml, в этом случае я получаю пустую строку.
Я проверил отправку того же XML с CURL в php и отлично работает, используя тип содержимого text / xml и даже text / html.
Кто-нибудь знает, в чем может быть проблема?
Вы отправляете свои данные как application/x-www-form-urlencoded
без URL кодирования вашего контента.
В URL-кодированных данных, &
разделяет два аргумента, поэтому PHP правильно интерпретирует ваши данные с указанной кодировкой, вы просто неправильно их кодируете. Это не проблема XML, это проблема кодирования URL.
В кодировке URL, амперсанд может быть экранирован с помощью %26
вместо амперсанда.
VBA не поставляется с кодировщиком URL. Либо используйте другую схему кодирования, напишите свою собственную, либо используйте одну из этот ответ
Я нашел обходной путь и разумное объяснение в этой статье:
PHP "PHP: // ввод" против $ _POST
Я подозревал, что тип содержимого в заголовках может быть проблемой, которая привела к этой статье, поэтому вместо использования $ _POST или $ _REQUEST для получения ввода вам нужно получить необработанный ввод, например, $ xml = file_get_contents (‘php: // вход ‘);
Я использую запрос Symfony, поэтому необработанный контент можно получить с помощью $ request-> getContent ().
Когда вы используете тип содержимого text / xml, он должен работать так же, как и в php, но кажется, что PHP superglobals отфильтровывает это, поэтому я получил пустую строку, но необработанный ввод все еще можно прочитать, используя php: // input ,