@Angelxalfa

Как экспортировать данных из XML в базу данных MySQL?

Есть файл XML содержащий порядка 100 000 строк обновляемый раз в месяц. Нужно данные из этого файла вносить в таблицу базы данных сайта на MySQL

Кусок файла XML:
<?xml version="1.0" encoding="UTF-8"?>
<document>
  <device_types>
    <type unit="1" name="567" id="1"/>
  </device_types>
  <location name="1">
    <street name="street">
      <house number="72А">
        <apartment number="3">
          <account id="1401160037" person="person">
            <device id="168576" value="157" date="2014-10-23 19:32:19" type="1"/>
            <device id="168716" value="30" date="2014-10-23 19:32:19" type="1"/>
          </account>
        </apartment>
        <apartment number="36">
          <account id="1401760040" person="person">
            <device id="158675" value="37" date="2014-10-24 17:33:43" type="1"/>
            <device id="164798" value="45" date="2014-10-24 17:33:43" type="1"/>
          </account>
        </apartment>
        <apartment number="48">
          <account id="1410760030" person="person">
            <device id="318922" value="11" date="2014-10-25 17:39:36" type="1"/>
            <device id="318977" value="39" date="2014-10-25 17:39:36" type="1"/>
          </account>
        </apartment>
      </house>
	</street>
    <street name="street">
      <house number="7">
        <apartment number="60">
          <account id="1503502005" person="person">
            <device id="263225" value="174" date="2014-10-23 08:23:51" type="1"/>
          </account>
        </apartment>
      </house>
      <house number="5">
        <apartment number="25">
          <account id="1503180057" person="person">
            <device id="170170" value="370" date="2014-10-23 19:01:35" type="1"/>
          </account>
        </apartment>
      </house>
    </street>
    <street name="street">
      <house number="1">
        <apartment number="90">
          <account id="1602800071" person="person">
            <device id="31210592" value="12" date="2014-10-23 09:17:16" type="1"/>
            <device id="312786" value="10" date="2014-10-23 09:17:16" type="1"/>
          </account>
        </apartment>
      </house>
      <house number="2">
        <apartment number="50">
          <account id="1602800033" person="person">
            <device id="2106610" value="119" date="2014-10-23 15:36:39" type="1"/>
          </account>
        </apartment>
        <apartment number="65">
          <account id="1602801017" person="person">
            <device id="227470" value="52" date="2014-10-25 17:09:02" type="1"/>
          </account>
        </apartment>
        <apartment number="35">
          <account id="1600170081" person="person">
            <device id="10130061225706" value="15" date="2014-10-25 19:08:11" type="1"/>
            <device id="10136134203" value="60" date="2014-10-25 19:08:11" type="1"/>
          </account>
        </apartment>
      </house>
    </street>
  </location>
</document>


Пытаюсь разобрать файл через SimpleXML этим кодом:

<?php 
    $xmlURL = "xml.xml";

    $sxml = simplexml_load_file($xmlURL);
   
    foreach($sxml->location->street as $street) {
        foreach($sxml->location->street->house as $house) {
	        $house_number = stripslashes($house->apartment->attributes()['number']);
            echo "<br>'$house_number'";
            $app_number = stripslashes($house->attributes()['number']);
            echo "_'$app_number'";
	        $id = ($house->apartment->account->attributes()['id']);
            echo "_'$id'";
        }     
    }
?>


В результате разбора происходит получение данных только из первого элемента вложения Street и при этом повторяются одни и те же данные столько раз, сколько есть элементов street, то есть из приложеного куска xml:

'3'_'72Рђ'_'1401160037'
'3'_'72Рђ'_'1401160037'
'3'_'72Рђ'_'1401160037'

А мне нужно чтобы данные брались из всех элементов. Подскажите пожалуйста, как можно это сделать?
  • Вопрос задан
  • 2857 просмотров
Решения вопроса 1
Evervess
@Evervess
С SimpleXML не работал никогда, но по общей логике должно быть так
foreach($sxml->location->street as $street) {
        foreach($street->house as $house) { //Перебираем дома только на текущей улице
	        $house_number = stripslashes($house->apartment->attributes()['number']);
            echo "<br>'$house_number'";
            $app_number = stripslashes($house->attributes()['number']);
            echo "_'$app_number'";
	        $id = ($house->apartment->account->attributes()['id']);
            echo "_'$id'";
        }     
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Вот так надо
foreach($sxml->location->street as $street) {
    foreach($street->house as $house) {
        // ...
    } 
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы