Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / XML file / 25 сообщений из 29, страница 1 из 2
11.06.2012, 20:39:01
    #37834680
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
Большой XML файл, одной строкой.
Нужно перелопать его и засунуть данные в БД. Внимание вопрос, как проще это сделать?
...
Рейтинг: 0 / 0
11.06.2012, 21:01:05
    #37834698
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
Пример документа:

Код: 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
11.06.2012, 22:14:56
    #37834773
MikkiMouse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
Hett,

Юзай XMLReader.
Вот тут есть немного инфы.
...
Рейтинг: 0 / 0
11.06.2012, 22:17:12
    #37834776
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
Сильно большой файл, мегабайты? Есть вероятность впереться в ограничение по памяти?
...
Рейтинг: 0 / 0
11.06.2012, 22:21:50
    #37834779
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
7 гигабайт самый большой
...
Рейтинг: 0 / 0
11.06.2012, 22:22:51
    #37834781
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
XMLReader вроде похоже на то, что надо, с утра по разбираюсь
...
Рейтинг: 0 / 0
11.06.2012, 23:10:01
    #37834811
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
Эммм... А не вариант читать xml кусочками, править на лету (теги выкусить, скобки/запятые добавить и т.п.) и выдавать готовый SQL, который после (или сразу в конвейере) скормить клиенту БД...?
...
Рейтинг: 0 / 0
12.06.2012, 11:06:44
    #37835039
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
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
13.06.2012, 22:58:41
    #37837004
nexoma
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
...
Рейтинг: 0 / 0
14.06.2012, 07:36:54
    #37837230
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
nexomam xml-parsing.
об XMLReader`е я уже отписал
...
Рейтинг: 0 / 0
14.06.2012, 07:56:34
    #37837243
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
HettXMLReader не справился, т.к. там первый тег содержит весь документ и как я понял он пытался его прочитать

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

xml_parser как раз самое то, для больших файлов, ибо потоковый
...
Рейтинг: 0 / 0
14.06.2012, 08:25:58
    #37837269
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
возможно я им как-то не правильно пользовался, но подходящего варианта не нашел и сам придумать на основе существующих методов не смог.
...
Рейтинг: 0 / 0
14.06.2012, 10:53:11
    #37837472
XML file
Код: 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
14.06.2012, 11:56:08
    #37837579
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
Этот скрипт предназначен для одноразового использования в домашних условиях.
Коллекции в базе называются именем корневого тега.
...
Рейтинг: 0 / 0
14.06.2012, 12:20:17
    #37837632
XML file
авторЭтот скрипт предназначен для одноразового использования в домашних условиях.
Коллекции в базе называются именем корневого тега.
Код: 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
14.06.2012, 12:52:09
    #37837714
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
1. У вас имеются лишние присваивания self::$collection = NULL;
2. trim($a) != '' - вместо таких извратов лучше пользоватья функцией empty()
3. Не строка там быть не может, т.к. парсим XML как никак
4. В вашем коде заложена другая логика и он вызовет ошибку с параметром $name == null
...
Рейтинг: 0 / 0
14.06.2012, 12:53:59
    #37837720
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
а нет, пардон, 4. пункт не в счет, но поведение все равно отличается, т.к. self::$collectionName не обнуляется в случае $name == null, так что все равно грубая ошибка.
...
Рейтинг: 0 / 0
14.06.2012, 12:56:33
    #37837726
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
Код: plaintext
 trim($a) != '' - вместо таких извратов лучше пользоватья функцией empty()
Тут я тоже погорячился, но все равно 4 пункт решает
...
Рейтинг: 0 / 0
14.06.2012, 13:05:09
    #37837748
XML file
предлагаю, не писать так много и так часто - лучше подумать, и написать всё сразу одним постом! ;)))
...
Рейтинг: 0 / 0
14.06.2012, 13:06:41
    #37837752
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
считайте это были hotfix`ы )
...
Рейтинг: 0 / 0
14.06.2012, 13:20:49
    #37837770
XML file
авторself::$collectionName не обнуляется в случае $name == null, так что все равно грубая ошибка.
http://www.php.net/manual/en/mongocollection.getname.php

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

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


не выполнится и self::$collectionName останется прежним, а $collection = null будет.
...
Рейтинг: 0 / 0
14.06.2012, 14:55:45
    #37837971
XML file
авторДа что мне мануал на монгу.
наверное, что бы не писать всякую чушь в коде!!! ;)
Код: 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
14.06.2012, 15:25:08
    #37838039
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML file
Я знаю про этот метод, но я счел, что он будет обращаться к СУБД для выяснения текущей коллекции что сильно сказалось бы на производительности, а выяснять и проводить тесты мне было лень.
...
Рейтинг: 0 / 0
14.06.2012, 15:53:22
    #37838112
XML file
авторя счел, что он будет обращаться к СУБД для выяснения текущей коллекции что сильно сказалось бы на производительности
попей чаю. и, передохни немного... ;)))
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / XML file / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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