Хобрук: Ваш путь к мастерству в программировании

Как преобразовать массив в xml и отправить третьей стороне?

У меня возникли проблемы с преобразованием массива в xml и последующей отправкой его на сторонний URL-адрес в виде сообщения xml.

Я считаю, что я близок, но мне чего-то не хватает, чтобы он работал. Я использую wordpress и гравитационную форму (я не думаю, что это имеет значение)

Вот что у меня есть до сих пор.

function post_to_third_party($entry, $form) {

  $post_url = 'https://xxxx.com/home/BorrowerImport.do?CampaignID=xxx';
  $body = array( 'firstname' => $entry['8.3'],      
    'lastname' => $entry['8.6'],
    'dayphone' => $entry['12'],
    'email' => $entry['11']    
  );

  $xml = new SimpleXMLElement('<application/>');
  $body = array_flip($body);
  array_walk($body, array ($xml, 'addChild'));
  print $xml->asXML();

  $ch = curl_init($url);
  //curl_setopt($ch, CURLOPT_MUTE, 1);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));
  curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_URL, $post_url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  $output = curl_exec($ch);
  echo $output;

  curl_close($ch); 
} 

Я также попробовал следующий код, который, кажется, работает, но var_dump выглядит как строка (201) "$firstname $lastname $dayphone $email" ok

Я не знаю, как заполнить теги xml данными, собранными из массива $body.

Вот код, который я использовал для этого результата

add_action('gform_after_submission', 'post_to_third_party', 10, 2);
function post_to_third_party($entry, $form) {

$post_url = 'https://xxxx.com/home/BorrowerImport.do?CampaignID=xxx';
$body = array(
    'firstname' =>     $entry['8.3'],      
    'lastname' =>     $entry['8.6'],
    'dayphone' =>   $entry['12'],
    'email' =>  $entry['11']    
    );
$xml = '

    <?xml version="1.0" encoding="UTF-8"?>
    <application>
    <firstname>$firstname</firstname>
    <lastname>$lastname</lastname>
    <dayphone>$dayphone</dayphone>
    <email>$email</email>
    </application>';
var_dump($xml);

$ch = curl_init($url);
    //curl_setopt($ch, CURLOPT_MUTE, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $post_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $output = curl_exec($ch);
    echo $output;

    curl_close($ch);

}

  • var_dump ваш xml и опубликуйте его. Я почти уверен, что вам нужно создать цикл для вашего массива для генерации XML. 08.04.2014
  • Кроме того, в чем проблема? Ваш PHP не создает XML-документ? XML-документ создан, но не отправлен? XML-документ отправлен, но отклонен другим сервером? Одна из возможных проблем: вы передаете объект SimpleXMLElement функции curl_setopt для аргумента CURLOPT_POSTFIELDS — вы хотите вместо этого передать строку XML? 08.04.2014
  • это то, что я получил, когда сделал var_dump($xml); test(801)[email protected] object(SimpleXMLElement)#310 (3) { [lastname]=>string(4) test [dayphone]=>string(13) (801)735-2222 [email]= › string(14) [email protected] } Ошибка импорта 08.04.2014
  • Говорит ошибка импорта 08.04.2014
  • @Kryten все, что мне сказали, это опубликовать XML-документ на стороннем URL-адресе, используя http post, структура xml выглядит следующим образом: ‹?xml version=1.0 encoding=UTF-8?› ‹application› ‹firstname›Jason‹/firstname › ‹фамилия›Доу/фамилия› ‹/приложение› 08.04.2014
  • XML-документ представляет собой структурированное представление некоторых данных. Удаленный сервер ожидает эти данные в определенной форме - если вы не отправляете их так, как этого хочет сервер, он будет жаловаться. К сожалению, сообщение об ошибке импорта является чрезвычайно бесполезным. Вам придется запросить схему XML, чтобы выяснить, как им нужны данные. 08.04.2014
  • @Kryten Я полагаю, что схема XML выглядит следующим образом (я не слишком хорошо разбираюсь в xml) ‹?xml версия=1.0 кодировка=UTF-8?› ‹приложение› ‹имя›Джейсон‹/имя› ‹фамилия›Доу/фамилия > 08.04.2014
  • @MattTheNinja, что вы подразумеваете под циклом? я должен использовать array_walk_recursive? 08.04.2014
  • Схема XML представляет собой подробную спецификацию допустимых значений и типов. То, что у вас есть, является образцом документа. Вы, вероятно, сможете сделать эту работу, если скопируете форму своего примера. Например, я заметил, что в вашем примере есть только поля firstname и lastname — возможно, серверу не нравятся поля dayphone и email. 08.04.2014
  • @Kryten Я просто сократил пример, чтобы показать вам, что фрагмент электронной почты и дневной телефон действительны в принятых полях. 08.04.2014
  • Я также использовал другой код, который, кажется, работает, но я понятия не имею, как получить данные из массива $body в соответствующие теги XML. См. выше 08.04.2014
  • Ваш исходный код, казалось, прекрасно строил XML-документ. Я попробовал его на ideone.com/1eQYVz. 08.04.2014
  • @Kryten, интересно, может быть, в примере xml указано ‹?xml version=1.0 encoding=UTF-8?›, а мой выдает только ‹?xml version=1.0?› если да, то как мне добавить encoding=UTF-8? ? 08.04.2014

Ответы:


1

Хорошо, вот проблема:

Метод, который вы используете для построения массива перед преобразованием в XML, случайно удаляет некоторые данные.

Вы начинаете с чего-то вроде этого:

$body = array(
    "firstname" => "Test",
    "lastname" => "Test",
    "dayphone" => "(801)735-2222",
    "email" => "[email protected]",
);

Затем вы вызываете array_flip, что дает вам это:

$body = array(
    "Test" => "firstname",
    "Test" => "lastname",
    "(801)735-2222" => "dayphone",
    "[email protected]" => "email",
);

Теперь у вас есть два ключа «Test» в вашем массиве. PHP сохраняет последний и отбрасывает первый. Итак, в вашем XML-документе теперь отсутствует один из необходимых ключей: «имя».

Решение состоит в том, чтобы создать свой XML-документ по старинке и не использовать причудливые вещи, такие как array_flip:

foreach($body as $k=$v)
    $xml->addChild($k, $v);
07.04.2014
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..