преобразование xml в массив json для sql

#php #sql #json #xml

#php #sql #json #xml

Вопрос:

Мне нужно импортировать файл в мою базу данных. Я получаю файл с URL-адреса с помощью curl, но я не могу его импортировать. Я предполагаю, что я довольно близок к этому, но я что-то упускаю в своем цикле foreach, чтобы получить всего рекламодателя. Я получаю массив, но не те элементы, которые мне нужны

 public function import()
{
    $url = $this->get_data();

    $xml = new SimpleXMLElement($url);
    $json_string = json_encode($xml);    
    $advertisers = json_decode($json_string, TRUE);
    $this->import_advertiser($advertisers);
}

public function import_advertiser($advertisers = [])
{
    echo $advertisers;
    if($advertisers) {
    foreach($advertisers as $advertiser)
    {   
    $attr = [
        'advertiser-id'       => $advertiser->advertiser-id,
        'advertiser-name'     => $advertiser->advertiser-name,
        'program-url'         => $advertiser->program-url,
        'relationship-status' => $advertiser->relationship-status,
        ];
    $this->db->replace($this->table_program_name, $attr);
    }
}}
  

Мой xml выглядит следующим образом, отредактированный:

 <?xml version="1.0" encoding="UTF-8"?>
<cj-api>
  <advertisers total-matched="2" records-returned="2" page-number="1">
    <advertiser>
      <advertiser-id>4942550</advertiser-id>
      <account-status>Active</account-status>
      <seven-day-epc>26.63</seven-day-epc>
      <three-month-epc>28.71</three-month-epc>
      <language>en</language>
      <advertiser-name>NIKE</advertiser-name>
      <program-url>http://www.nike.com</program-url>
      <relationship-status>notjoined</relationship-status>
      <mobile-tracking-certified>true</mobile-tracking-certified>
      <cookieless-tracking-enabled>true</cookieless-tracking-enabled>
      <network-rank>5</network-rank>
      <primary-category>
        <parent>Sports amp;amp; Fitness</parent>
        <child>Apparel</child>
      </primary-category>
      <performance-incentives>false</performance-incentives>
      <actions>
        <action>
          <name>Nike.com Purchase</name>
          <type>advanced sale</type>
          <id>393783</id>
          <commission>
            <itemlist name="Hurley Non-Commissionables" id="33329">USD 0.00</itemlist>
            <itemlist name="Converse Non-Commissionables" id="33330">USD 0.00</itemlist>
            <itemlist name="Nike Non-Commissionables" id="33331">USD 0.00</itemlist>
            <itemlist name="Flash Sale" id="33643">1.00%</itemlist>
            <itemlist name="Flash Sale Non-Commissionables" id="33644">USD 0.00</itemlist>
            <default>3.00%</default>
          </commission>
        </action>
        <action>
          <name>Nike.com Mobile Purchase</name>
          <type>advanced sale</type>
          <id>393784</id>
          <commission>
            <itemlist name="Hurley Non-Commissionables" id="33329">USD 0.00</itemlist>
            <itemlist name="Converse Non-Commissionables" id="33330">USD 0.00</itemlist>
            <itemlist name="Nike Non-Commissionables" id="33331">USD 0.00</itemlist>
            <itemlist name="Flash Sale" id="33643">1.00%</itemlist>
            <itemlist name="Flash Sale Non-Commissionables" id="33644">USD 0.00</itemlist>
            <default>3.00%</default>
          </commission>
        </action>
      </actions>
      <link-types>
        <link-type>Text Link</link-type>
        <link-type>Banner</link-type>
        <link-type>OtherDeepLink</link-type>
        <link-type>Test Link</link-type>
        <link-type>DeepLink</link-type>
        <link-type>AutoMoneyDeepLink</link-type>
      </link-types>
    </advertiser>
    <advertiser>
      <advertiser-id>4659293</advertiser-id>
      <account-status>Setup</account-status>
      <seven-day-epc>N/A</seven-day-epc>
      <three-month-epc>N/A</three-month-epc>
      <language>en</language>
      <advertiser-name>Nike</advertiser-name>
      <program-url>http://www.nike.com</program-url>
      <relationship-status>notjoined</relationship-status>
      <mobile-tracking-certified>false</mobile-tracking-certified>
      <cookieless-tracking-enabled>false</cookieless-tracking-enabled>
      <network-rank>0</network-rank>
      <primary-category>
        <parent>Sports amp;amp; Fitness</parent>
        <child>Apparel</child>
      </primary-category>
      <performance-incentives/>
      <actions/>
      <link-types>
        <link-type>Text Link</link-type>
      </link-types>
    </advertiser>
  </advertisers>
</cj-api>  

Я вижу, что он пытался подключиться к моей базе данных, но таблица не импортирует данные

Комментарии:

1. Я получаю сообщение об ошибке $xml = new SimpleXMLElement($url); из этого элемента в файле XML <parent>Home amp; Garden</parent>

2. Я sry, теперь я отредактировал свой xml

Ответ №1:

Кажется, вы немного запутались с массивами и объектами в этой функции

Как вы использовали $advertisers = json_decode($json_string, TRUE); в предыдущей функции, тогда пара простых изменений исправит создание $attr массива. Кроме того, вы не запускали цикл foreach в нужной точке структуры данных.

 function import_advertiser($advertisers = [])
{

    if($advertisers) {
        foreach($advertisers['advertisers']['advertiser'] as $advertiser) {   
            $attr = [
                'advertiser-id'       => $advertiser['advertiser-id'],
                'advertiser-name'     => $advertiser['advertiser-name'],
                'program-url'         => $advertiser['program-url'],
                'relationship-status' => $advertiser['relationship-status']
                ];
            $this->db->replace($this->table_program_name, $attr);
        }
    }
}
  

Комментарии:

1. Я тоже пробовал это, но забыл использовать $advertisers[‘рекламодатели’][‘рекламодатель’], большое вам спасибо, это решило мою проблему 🙂

Ответ №2:

Ваш XML неправильно сформирован. «amp;» должно быть

  • либо экранированный ( <parent>Home amp;amp; Garden</parent> )
  • или помещается в раздел CDATA ( <parent><![CDATA[Home amp; Garden]]></parent> )