powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / XML file
25 сообщений из 29, страница 1 из 2
XML file
    #37834680
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой XML файл, одной строкой.
Нужно перелопать его и засунуть данные в БД. Внимание вопрос, как проще это сделать?
...
Рейтинг: 0 / 0
XML file
    #37834698
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример документа:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<?xml version="1.0" encoding="utf-8"?>
<AddressObjects>
    <Object AOID="149c0ccb-51fd-4776-8c6d-000023253cdc" AOGUID="323febe6-cd89-4773-a46c-aab794fb7cbc"
            PARENTGUID="724dea3f-c799-4880-aa56-f0c801a3359a" FORMALNAME="Московская" OFFNAME="Московская"
            SHORTNAME="ул" AOLEVEL="7" REGIONCODE="68" AREACODE="017" AUTOCODE="0" CITYCODE="000" CTARCODE="000"
            PLACECODE="028" STREETCODE="0004" EXTRCODE="0000" SEXTCODE="000" PLAINCODE="680170000280004"
            CODE="68017000028000400" CURRSTATUS="0" ACTSTATUS="1" LIVESTATUS="1" CENTSTATUS="0" OPERSTATUS="1"
            IFNSFL="6828" IFNSUL="6828" TERRIFNSFL="6815" TERRIFNSUL="6815" OKATO="68228822001" OKTMO="68628422"
            POSTALCODE="393290" STARTDATE="1900-01-01" ENDDATE="2079-06-06" UPDATEDATE="2011-09-14"/>

    <Object AOID="ed3cadb1-9820-48ad-98e0-00002d832f71" AOGUID="0e8b1e3c-01e0-4ebd-9bfc-584b157b0b31"
            PARENTGUID="a52b7389-0cfe-46fb-ae15-298652a64cf8" FORMALNAME="Лавровая" OFFNAME="Лавровая" SHORTNAME="ул"
            AOLEVEL="7" REGIONCODE="34" AREACODE="000" AUTOCODE="0" CITYCODE="001" CTARCODE="000" PLACECODE="000"
            STREETCODE="1386" EXTRCODE="0000" SEXTCODE="000" PLAINCODE="340000010001386" CODE="34000001000138600"
            CURRSTATUS="0" ACTSTATUS="1" LIVESTATUS="1" CENTSTATUS="0" OPERSTATUS="1" IFNSFL="3461" IFNSUL="3461"
            TERRIFNSFL="3447" TERRIFNSUL="3447" OKATO="18401370000" OKTMO="18701000" STARTDATE="1900-01-01"
            ENDDATE="2079-06-06" UPDATEDATE="2011-09-18"/>
    <Object AOID="2ec0c1b1-a652-4ca8-91bc-0000553c3187" AOGUID="8dac1393-f914-47f7-b78b-3cbacd8950f2"
            PARENTGUID="e879c06b-d180-4177-a6ff-4aad5588c6b3" FORMALNAME="Верхние Брусы" OFFNAME="Верхние Брусы"
            SHORTNAME="д" AOLEVEL="6" REGIONCODE="71" AREACODE="016" AUTOCODE="0" CITYCODE="000" CTARCODE="000"
            PLACECODE="044" STREETCODE="0000" EXTRCODE="0000" SEXTCODE="000" PLAINCODE="71016000044"
            CODE="7101600004400" CURRSTATUS="0" ACTSTATUS="1" LIVESTATUS="1" CENTSTATUS="0" OPERSTATUS="1" IFNSFL="7148"
            IFNSUL="7148" TERRIFNSFL="7130" TERRIFNSUL="7130" OKATO="70232804009" OKTMO="70632476" POSTALCODE="301126"
            STARTDATE="1900-01-01" ENDDATE="2079-06-06" UPDATEDATE="2011-09-14"/>
    <Object AOID="a66bd263-70c4-4fe6-8ee9-000056c77c31" AOGUID="00468156-f575-427d-9053-6a3523261a8d"
            PARENTGUID="3588ca22-4913-4e88-9eb6-107aef30fe46" FORMALNAME="Лужки" OFFNAME="Лужки" SHORTNAME="п"
            AOLEVEL="6" REGIONCODE="57" AREACODE="015" AUTOCODE="0" CITYCODE="000" CTARCODE="000" PLACECODE="211"
            STREETCODE="0000" EXTRCODE="0000" SEXTCODE="000" PLAINCODE="57015000211" CODE="5701500021100" CURRSTATUS="0"
            ACTSTATUS="1" LIVESTATUS="1" CENTSTATUS="0" OPERSTATUS="1" IFNSFL="5744" IFNSUL="5744" TERRIFNSFL="5717"
            TERRIFNSUL="5717" OKATO="54236828009" OKTMO="54636428" POSTALCODE="303013" STARTDATE="1900-01-01"
            ENDDATE="2079-06-06" UPDATEDATE="2011-09-14"/>
    <Object AOID="1c535525-10dd-4a68-985e-000082dd005d" AOGUID="1b9deb75-7dbe-4844-85c6-0960df4185aa"
            PARENTGUID="73b557d5-9151-4354-81a1-314e192795a0" FORMALNAME="Молодежная" OFFNAME="Молодежная"
            SHORTNAME="ул" AOLEVEL="7" REGIONCODE="02" AREACODE="060" AUTOCODE="0" CITYCODE="000" CTARCODE="000"
            PLACECODE="062" STREETCODE="0002" EXTRCODE="0000" SEXTCODE="000" PLAINCODE="020600000620002"
            CODE="02060000062000200" CURRSTATUS="0" ACTSTATUS="1" LIVESTATUS="1" CENTSTATUS="0" OPERSTATUS="1"
            IFNSFL="0260" IFNSUL="0260" OKATO="80224813001" OKTMO="80624413" POSTALCODE="452312" STARTDATE="1900-01-01"
            ENDDATE="2079-06-06" UPDATEDATE="2011-09-14"/>



только в 1 строчку все.
Есть идея читать файл понемногу и матчить и заносить в базу, пока не могу придумать, как отделить уже обработанный XML от не до конца считанного хвоста, если обрабатывать тем же preg_match_all (к примеру), так будет проще, т.к. набор полей может различаться.
...
Рейтинг: 0 / 0
XML file
    #37834773
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

Юзай XMLReader.
Вот тут есть немного инфы.
...
Рейтинг: 0 / 0
XML file
    #37834776
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сильно большой файл, мегабайты? Есть вероятность впереться в ограничение по памяти?
...
Рейтинг: 0 / 0
XML file
    #37834779
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
7 гигабайт самый большой
...
Рейтинг: 0 / 0
XML file
    #37834781
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLReader вроде похоже на то, что надо, с утра по разбираюсь
...
Рейтинг: 0 / 0
XML file
    #37834811
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эммм... А не вариант читать xml кусочками, править на лету (теги выкусить, скобки/запятые добавить и т.п.) и выдавать готовый SQL, который после (или сразу в конвейере) скормить клиенту БД...?
...
Рейтинг: 0 / 0
XML file
    #37835039
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLReader не справился, т.к. там первый тег содержит весь документ и как я понял он пытался его прочитать.

Сделал с помощью xml_parser

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Hett
 * Date: 11.06.12
 * Time: 23:42
 */

header('Content-type: text/plain');

Mdb::init('fias');
$dirName = 'C:\data\fias_xml';


$directoryIterator = new DirectoryIterator($dirName);
/** @var SplFileInfo $item */
foreach($directoryIterator as $item) {
    if($item->isFile()) {
        $p = xml_parser_create('utf-8');
        xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, false);
        xml_set_element_handler($p, 'start_element', 'end_element');

        if($f = fopen($item->getRealPath(), 'r')) {
            echo "Parse file " . $item->getFilename() . "\n";
            while($data = fread($f, 4096)) {
                $this_chunk_parsed = xml_parse($p, $data, feof($f));
                if(!$this_chunk_parsed) {
                    $error_code = xml_get_error_code($p);
                    $error_text = xml_error_string($error_code);
                    $error_line = xml_get_current_line_number($p);

                    $output_text = "Parsing problem at line $error_line: $error_text";
                    echo $output_text, "\n";
                }
            }
        }
        xml_parser_free($p);
    }
}

function start_element($parser, $name, $attrs) {
    if(MDb::collectionSelected()) {
        MDb::write($attrs);
    } else {
        MDb::setCollection($name);
        echo "Select collection '{$name}'\n";
    }
}

function end_element($parser, $name) {
    if(MDb::getCollectionName() == $name) {
        MDb::setCollection(null);
        echo "Close collection '{$name}'\n";
    }
}

class MDb {
    protected static $collectionName;
    /** @var MongoCollection $collection */
    protected static $collection;
    /** @var Mongo $db */
    protected static $db;
    protected static $dbName;
    protected static $count;
    protected static $tStart;

    public static function init($dbName)
    {
        self::$db = new Mongo();
        self::$dbName = $dbName;
        self::$count = 0;
    }

    public static function setCollection($name)
    {
        self::$collectionName = $name;
        if(!is_null(self::$collectionName)) {
            self::$collection = self::$db->selectCollection(self::$dbName, $name);
        } else {
            self::$collection = null;
        }
    }

    public static function collectionSelected()
    {
        return self::$collectionName !== null;
    }

    public static function getCollectionName()
    {
        return self::$collectionName;
    }

    public static function write(array $data)
    {
        if(!is_null(self::$collection)) {
            self::$collection->insert($data);
            self::$count++;
            if(self::$count % 5000 == 0) {
                echo "In process: count " . self::$count . "\n";
            }
        } else {
            echo 'Error: insert into no selected collection!', "\n";
        }

    }
}

...
Рейтинг: 0 / 0
XML file
    #37837004
Фотография nexoma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
XML file
    #37837230
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nexomam xml-parsing.
об XMLReader`е я уже отписал
...
Рейтинг: 0 / 0
XML file
    #37837243
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettXMLReader не справился, т.к. там первый тег содержит весь документ и как я понял он пытался его прочитать

в любом валидном xml документе должен быть один корневой тег )

xml_parser как раз самое то, для больших файлов, ибо потоковый
...
Рейтинг: 0 / 0
XML file
    #37837269
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно я им как-то не правильно пользовался, но подходящего варианта не нашел и сам придумать на основе существующих методов не смог.
...
Рейтинг: 0 / 0
XML file
    #37837472
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
public static function setCollection($name)
    {
        self::$collectionName = $name;
        if(!is_null(self::$collectionName)) {
            self::$collection = self::$db->selectCollection(self::$dbName, $name);
        } else {
            self::$collection = null;
        }
    }


задумался...
...
Рейтинг: 0 / 0
XML file
    #37837579
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот скрипт предназначен для одноразового использования в домашних условиях.
Коллекции в базе называются именем корневого тега.
...
Рейтинг: 0 / 0
XML file
    #37837632
авторЭтот скрипт предназначен для одноразового использования в домашних условиях.
Коллекции в базе называются именем корневого тега.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
public static function setCollection($name)
{
     self::$collection = NULL;

     if (is_string($name) && trim($a) != '') {        
         self::$collection = self::$db->selectCollection(self::$dbName, self::$collectionName = $name);        
     }
}
...
Рейтинг: 0 / 0
XML file
    #37837714
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. У вас имеются лишние присваивания self::$collection = NULL;
2. trim($a) != '' - вместо таких извратов лучше пользоватья функцией empty()
3. Не строка там быть не может, т.к. парсим XML как никак
4. В вашем коде заложена другая логика и он вызовет ошибку с параметром $name == null
...
Рейтинг: 0 / 0
XML file
    #37837720
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нет, пардон, 4. пункт не в счет, но поведение все равно отличается, т.к. self::$collectionName не обнуляется в случае $name == null, так что все равно грубая ошибка.
...
Рейтинг: 0 / 0
XML file
    #37837726
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
 trim($a) != '' - вместо таких извратов лучше пользоватья функцией empty()
Тут я тоже погорячился, но все равно 4 пункт решает
...
Рейтинг: 0 / 0
XML file
    #37837748
предлагаю, не писать так много и так часто - лучше подумать, и написать всё сразу одним постом! ;)))
...
Рейтинг: 0 / 0
XML file
    #37837752
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
считайте это были hotfix`ы )
...
Рейтинг: 0 / 0
XML file
    #37837770
авторself::$collectionName не обнуляется в случае $name == null, так что все равно грубая ошибка.
http://www.php.net/manual/en/mongocollection.getname.php

P.S считайте это были hotfix`ы ) (C)
...
Рейтинг: 0 / 0
XML file
    #37837809
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что мне мануал на монгу.
При name = null условие

Код: php
1.
 if (is_string($name) && trim($a) != '')


не выполнится и self::$collectionName останется прежним, а $collection = null будет.
...
Рейтинг: 0 / 0
XML file
    #37837971
авторДа что мне мануал на монгу.
наверное, что бы не писать всякую чушь в коде!!! ;)
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public static function collectionSelected()
{
    return self::$collection;
}

public static function getCollectionName()
{
    if(self::collectionSelected()) {
         return self::$collection->getName();
    }
}


Успехов!!!
...
Рейтинг: 0 / 0
XML file
    #37838039
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знаю про этот метод, но я счел, что он будет обращаться к СУБД для выяснения текущей коллекции что сильно сказалось бы на производительности, а выяснять и проводить тесты мне было лень.
...
Рейтинг: 0 / 0
XML file
    #37838112
авторя счел, что он будет обращаться к СУБД для выяснения текущей коллекции что сильно сказалось бы на производительности
попей чаю. и, передохни немного... ;)))
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / XML file
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]