Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Как распарсить сложный XML?
Покинул форум
Сообщений всего: 18
Дата рег-ции: Янв. 2009
Помог: 0 раз(а)
Есть XML нижеуказанного вида.
Я не большой специалист в парсинге. Кинулся юзать Dom.
Пример запроса ниже.
Но столкнулся со следующим:
Парсер показывает 3 узла: Uzel 0 : Source=
NewsBox Uzel 1 : Time=
23.01.2009 16:57:18 Uzel 2 : InfoItem=
"ЦБ повысил с 24/01 учетную цену золота до 923,22 руб дубльБиржи Банки ФондыСитуация и прогноз....... текст весь что есть в этом блоке без всяких <> заканчивая[B] ....... Департаментом внешних и общественных связей ЦБ РФ".
[b]Т.е. узел InfoItem не распарсилсяна вложенные в него подузлы! Зато исчезли теги таблиц
Как правильно сделать или хотя бы в каком направлении думать. Пож-ста. Сложность еще в том, что кодировка файла не UTF-8
Нужно чтобы работало на PHP5.
Наверняка есть команды или варианты обхода и вложенных узлов... Но что то пример нагуглить не могу. Да и 90 % почему то варианты нерабочие на PHP5 скачиваю...
Пропали в выводе теги вложенной таблицы. Их бы тоже сохранить как
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 3: parser error : Premature end of data in tag Source line 3 in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <Time type="datetime">23.01.2009 16:57:18</Time><InfoItem><Source type="string"> in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 3: parser error : Premature end of data in tag InfoItem line 3 in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <Time type="datetime">23.01.2009 16:57:18</Time><InfoItem><Source type="string"> in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 3: parser error : Premature end of data in tag InfoPacket line 3 in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <Time type="datetime">23.01.2009 16:57:18</Time><InfoItem><Source type="string"> in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in e.php on line 2
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in e.php:2 Stack trace: #0 e.php(2): SimpleXMLElement->__construct('<?xml version="...') #1 {main} thrown in e.php on line 2
Stierus
Отправлено: 27 Января, 2009 - 17:24:23
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Вы про InfoPacket забыли : $xml->InfoPacket->InfoItem->Text[1]
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 3: parser error : Premature end of data in tag Source line 3 in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <Time type="datetime">23.01.2009 16:57:18</Time><InfoItem><Source type="string"> in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 3: parser error : Premature end of data in tag InfoItem line 3 in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <Time type="datetime">23.01.2009 16:57:18</Time><InfoItem><Source type="string"> in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 3: parser error : Premature end of data in tag InfoPacket line 3 in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: <Time type="datetime">23.01.2009 16:57:18</Time><InfoItem><Source type="string"> in e.php on line 2
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in e.php on line 2
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in e.php:2 Stack trace: #0 e.php(2): SimpleXMLElement->__construct('<?xml version="...') #1 {main} thrown in e.php on line 2 (Добавление)
Распарсил вот так:
$dom = new DOMDocument();
$dom->load("person.xml");
$xpath = new DOMXPath($dom);
$arts = $xpath->query("/InfoPacket/Source/Text");
Но при этом у меня "пропадает" форматирование таблицы (оно становится тоже названиями узлов).
Как сделать так, чтобы некоторые вещи, похожие на узлы, таковыми не считались?
valenok
Отправлено: 27 Января, 2009 - 20:18:06
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
simplexml_load_file() - создает из документа xml класс со свойствами... Вы можете пробежатся по нему как по массиву,
учитывая "<![!DATA", вложенось и прочие XML заморочки.
----- Тамбовский каджит тебе товарищ
President
Отправлено: 27 Января, 2009 - 20:54:27
Новичок
Покинул форум
Сообщений всего: 18
Дата рег-ции: Янв. 2009
Помог: 0 раз(а)
valenok пишет:
Среди всего этого я не заметил одного - что получить то надо..
http://ru.php.net/manual/ru/function.xml-parse.php#87920
Не работает. Там только UTF-8 (Добавление)
Заработало! Спасибо! Только я не понял как теперь там табличку то вставить в правильное место .... Точнее тег Data и Table исчезли нафиг
SimpleXMLElement Object ( [Source] => NewsBox [Time] => 23.01.2009 16:57:18 [InfoItem] => SimpleXMLElement Object ( [Source] => ПРАЙМ ТАСС [Time] => 23.01.2009 15:54:00 [Title] => ЦБ повысил с 24/01 учетную цену золота до 923,22 руб дубль [Topic] => Array ( [0] => Биржи Банки Фонды [1] => Ситуация и прогнозы ) [Direction] => Array ( [0] => free [1] => Бульон ) [Author] => с [Keyword] => Array ( [0] => ЗОЛОТО-БАНК [1] => ДРАГМЕТАЛЛЫ-ЦЕНЫ ) [Language] => RUS [Option] => Array ( [0] => insert [1] => 13188 [2] => 6 [3] => 7 [4] => 18 [5] => 32 [6] => МОСКВА, 23 января. /ПРАЙМ-ТАСС/. ЦБ РФ установил с 24 января следующие учетные цены на драгоценные металлы: ) [Text] => Array ( [0] => МОСКВА, 23 января. /ПРАЙМ-ТАСС/. ЦБ РФ установил с 24 января следующие учетные цены на драгоценные металлы: [1] => ЦЕНЫ НА ДРАГОЦЕННЫЕ МЕТАЛЛЫ ЦБ РФ * с 24.01.2009 [2] => * - цены и тренд указаны в рублях за 1 грамм [3] => Данные предоставлены Департаментом внешних и общественных связей ЦБ РФ ) ) )
Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007
Помог: 0 раз(а)
President пишет:
Заработало! Спасибо! Только я не понял как теперь там табличку то вставить в правильное место
Я когда в первый раз XML парсил сложный, тоже "шокировался" по типу "ээ а где остальное".
На самом деле отображается глубина не более 3-х вроде... Это специфика перевода в array. Показывает 3, а содержит все.
Чтобы получить полную копию xml->array можно обработать как-то так
Как видите, мы получили подробненько всего монстра.
Учтите, что я не приводил к cp1251, так как пример учебный.
Резюмирую:
То что simplexml выводит xml в таком необычном на первый взгляд виде - это нормально и правильно. А то что таблички "пропали", так просто они слишком глубоко лежали и были скрыты.
Если нужны более подробные/точные пояснения, прошу стучать в аську, не стесняйтесь.
Покинул форум
Сообщений всего: 18
Дата рег-ции: Янв. 2009
Помог: 0 раз(а)
Попробую так... Хотя странно, что теги табличек пропали, а информация то из них тянется.
Я думаю, а может сначала поменять эти теги через eger_replace да и жделу конец
Джур
Отправлено: 28 Января, 2009 - 14:13:41
Посетитель
Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007
Помог: 0 раз(а)
President оставте кактус в покое, он у меня один остался
Возможно вам таки стоит описать задачу, что вы хотите получить. А то я так подозреваю что мы вас не понимаем... или вы нас.
----- Тамбовский каджит тебе товарищ
President
Отправлено: 29 Января, 2009 - 20:48:24
Новичок
Покинул форум
Сообщений всего: 18
Дата рег-ции: Янв. 2009
Помог: 0 раз(а)
Так у меня что то и не получается, простите глупого
В последнем варианте выводятся крякозябры, а мозга исправить мало. Спинной тока видно остался
Сделал тему: http://forum.php.su/topic.php?fo...60&topic=499 (Добавление)
[quote=valenok]Среди всего этого я не заметил одного - что получить то надо..
http://ru.php.net/manual/ru/function.xml-parse.php#87920[/quote]
Не работает. Видно проблема с кодировкой (Добавление)
[quote=Джур][/quote]Сумел сделать так:
На выходе получил массив
Теперь тот же профиль: а как распарсить массив?
Как запустить перебор его с тем, чтобы когда элемент массива описывается как:
Array ( [0] => Array ( [Column] => Array ( [0] => металл [1] => учетная цена [2] => тренд )
У меня бы было:
<table><td><tr>металл</td><td>учетная цена</td><td>тренд</td></tr>
Вот полученный результат массива (он меня в ужас приводит):
Array ( [Source] => Array ( [0] => NewsBox ) [Time] => Array ( [0] => 23.01.2009 16:57:18 ) [InfoItem] => Array ( [0] => Array ( [Source] => Array ( [0] => ПРАЙМ ТАСС ) [Time] => Array ( [0] => 23.01.2009 15:54:00 ) [Title] => Array ( [0] => ЦБ повысил с 24/01 учетную цену золота до 923,22 руб дубль ) [Topic] => Array ( [0] => Биржи Банки Фонды [1] => Ситуация и прогнозы ) [Direction] => Array ( [0] => free [1] => Бульон ) [Author] => Array ( [0] => с ) [Keyword] => Array ( [0] => ЗОЛОТО-БАНК [1] => ДРАГМЕТАЛЛЫ-ЦЕНЫ ) [Language] => Array ( [0] => RUS ) [Option] => Array ( [0] => insert [1] => 13188 [2] => 6 [3] => 7 [4] => 18 [5] => 32 [6] => МОСКВА, 23 января. /ПРАЙМ-ТАСС/. ЦБ РФ установил с 24 января следующие учетные цены на драгоценные металлы: ) [Text] => Array ( [0] => МОСКВА, 23 января. /ПРАЙМ-ТАСС/. ЦБ РФ установил с 24 января следующие учетные цены на драгоценные металлы: [1] => Array ( [Data] => Array ( [0] => Array ( [Table] => Array ( [0] => Array ( [Column] => Array ( [0] => металл [1] => учетная цена [2] => тренд ) [Row] => Array ( [0] => Array ( [Cell] => Array ( [0] => золото [1] => 923.22 [2] => +29.26 ) ) [1] => Array ( [Cell] => Array ( [0] => серебро [1] => 11.97 [2] => +0.01 ) ) [2] => Array ( [Cell] => Array ( [0] => платина [1] => 982.44 [2] => +1.74 ) ) [3] => Array ( [Cell] => Array ( [0] => палладий [1] => 193.53 [2] => -1.56 ) ) ) ) ) ) ) ) [2] => * - цены и тренд указаны в рублях за 1 грамм [3] => Данные предоставлены Департаментом внешних и общественных связей ЦБ РФ ) ) ) )
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.