[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсинг xml смешанной структуры
mika
Здравствуйте!
Столкнулся с проблемой обработки xml со смешанным содержимым. До меня его обрабатывали через SimpleXml - предыдущий программист, но т.к. он рассматривал его как документ постоянной структуры - получалось 70% ошибочных значений - заменялись на null - было велено переписать. Переделываю на DOM, но никак не могу придумать как организовать обработчик внутри тега - как правильно сделать цикл, чтобы распарсилось именно по порядку нужной структуры.

Вот собственно xml - укороченный вариант - с двумя составляющими (так их обычно бывает больше тысячи)

<?xml version="1.0" encoding="utf-8" ?>
<root>
<value>
<Item>
<key0>

<Operation>
<OperTypeID>8</OperTypeID>
<OperCtgID>4</OperCtgID>
<OperName>Обработка</OperName>
<DateOper>23.11.2013 12:47:00</DateOper>
<IndexOper>392999</IndexOper>
</Operation>
<Barcode>39297268195810</Barcode>
</key0>
<key1>

<Operation>
<key0>
<OperTypeID>8</OperTypeID>
<OperCtgID>4</OperCtgID>
<OperName>Прием</OperName>
<DateOper>23.11.2013 00:00:00</DateOper>
<IndexOper>392960</IndexOper>
</key0>
<key1>
<OperTypeID>8</OperTypeID>
<OperCtgID>4</OperCtgID>
<OperName>Вручение</OperName>
<DateOper>24.11.2013 00:00:00</DateOper>
<IndexOper>394964</IndexOper>
</key1>
</Operation>
<Barcode>39297268200934</Barcode>
</key1>
</Item>
<FileName>7715800174_1_20130603_1000_In.xml</FileName>
<FileNumber>0</FileNumber>
</value>
</root>


Вот кусок кода:
for ($key_i = 0; $key_i < $barcodes->length; $key_i++)
{
$key = $dom->getElementsByTagName('key'. $key_i)->item($key_i)->nodeValue;
echo "<br><br>key " . $key_i . "\n<br>";

$barcode = $dom->getElementsByTagName('Barcode')->item($key_i)->nodeValue;
echo $barcode . "\n<br>";;
$opers = $dom->getElementsByTagName('OperName');

for ($j = 0; $j < $opers->length; $j++)
{
$opername = iconv('UTF-8', 'CP1251', $dom->getElementsByTagName('OperName')->item($j)->nodeValue);
echo $opername. " \n<br>";

$indexoper = $dom->getElementsByTagName('IndexOper')->item($j)->nodeValue;
echo $indexoper. " \n<br>";

$dateoper = $dom->getElementsByTagName('DateOper')->item($j)->nodeValue;
echo $dateoper. " \n<br>";
}

};

Тут конечно очевидно, что обрабатывается неправильно и вывод соответственно на экран следующий:
key 0
39297268195810
Обработка
392999
23.11.2013 12:47:00
Прием
392960
23.11.2013 00:00:00
Вручение
394964
24.11.2013 00:00:00


key 1
39297268200934
Обработка
392999
23.11.2013 12:47:00
Прием
392960
23.11.2013 00:00:00
Вручение
394964
24.11.2013 00:00:00

Но во как организовать внутренний цикл, чтобы для каждого ключа бралось только свои операции - то есть для первого получается одна операция, для второго две, а не все сразу выводились - тупик, никак не могу придумать. Подскажите пожалуйста, кому не сложно - уже сто вариантов кода рассмотрел - а толку ноль. Для типовых то xml все получается на раз, а вот для таких..


Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.