БД доступа VBA публикует XML на php-сервере и изменяет его на ["amp_ - PullRequest
0 голосов
/ 01 ноября 2018

У меня проблема с чтением 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 &amp; 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.

Кто-нибудь знает, в чем может быть проблема?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы отправляете свои данные как application/x-www-form-urlencoded без url-кодировки вашего контента.

В данных, закодированных в URL, & разделяет два аргумента, поэтому PHP правильно интерпретирует ваши данные с указанной кодировкой, а вы просто неправильно их кодируете. Это не проблема XML, это проблема кодирования URL.

В кодировке URL-адреса амперсанд можно экранировать, используя %26 вместо амперсанда.

VBA не поставляется с кодировщиком URL. Либо используйте другую схему кодировки, напишите свою собственную, либо используйте схему, приведенную в этот ответ

0 голосов
/ 01 ноября 2018

Я нашел обходной путь и разумное объяснение в этой статье:

PHP "php: // input" против $ _POST

Я подозревал, что тип содержимого в заголовках может быть проблемой, которая привела к этой статье, поэтому вместо использования $ _POST или $ _REQUEST для получения ввода вам нужно получить необработанный ввод, например, $ xml = file_get_contents ('php // ввод ');

Я использую запрос Symfony, чтобы получить необработанный контент с помощью $ request-> getContent ().

Когда вы используете тип содержимого text / xml, он должен работать так же, как и в php, но кажется, что PHP superglobals отфильтровывает это, поэтому я получил пустую строку, но необработанный ввод по-прежнему можно прочитать с помощью php: // ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...