Найти - Пользователи
Полная версия: Многоуровневый анализ XML через SAX
Начало » Python для экспертов » Многоуровневый анализ XML через SAX
1 2 3 4 5
Aristo.py
А если действовать через InputSource, а именно через setCharacterStream(charfile) и getCharacterStream()? только непонятно как они будут читать файл и записывать нужный кусок в переменную… но зато он возвращает файл-обьект с содержимым (непонятно каким)…
Aristo.py
А возможно использование InputSource в паре с Locator, чтобы последний передовал InputSource положение в файле?
Ed
Раз дискуссия продолжается отвечу на то, что мне непонятно.
Aristo.py
Определилось кол-во видов нодов для обработки. Набор нужных тегов, которые содержаться в них, и в итоге:
стало очевидно, что этот подход не для моего случая, т.к.:
1) Нужно обрабарывать содержимое 2-4 основных тегов (наподобие “Номенклатура” или “ОписанияПараметров”);
Здесь уже непонятно.

2)В парсере должен быть предусмотрен легкий разбор подуровней (почти,предел есть всему)бесконечного кол-ва уровней вложенности, потому как исходный документ может немного меняться в сторону увеличения уровней вложенности, поэтому надо предусмотреть легкое добавление обработчика последнего(возможно нового) уровня.
И? В чем Вы видите сложность добавления нужных уровней в моем подходе?

Руководитель рекомендует (читай: настаивает) на варианте подхода с выдиранием по 1му ноду (типа “Номенклатура”) в переменную, и обрабатывать этот кусочек отдельно, преимущество: - позволяет легко изменять кол-во обрабатываемых уровней, а также нодов.
Это я не понял совсем. Дичь какая-то по-моему.

Складывается впечатление, что мы говорим о разном. Давайте так: Вы рисуете мне конкретный случай в виде xml, где мой подход не подходит, а я вам решение. Ну или соглашаюсь, что он таки не подходит.
Aristo.py
Ок. Пример:
<?xml version=“1.0” encoding=“windows-1251”?>
<main>
<Данные>
<Справочник.Номенклатура>
<IDD>11111110</IDD>
<Код>00000001</Код>
<Наименование>АКСЕССУАРЫ</Наименование>
<ПометкаУдаления>Ложь</ПометкаУдаления>
<ЭтоГруппа>Истина</ЭтоГруппа>
<Родитель>
<Вид>Блалалалал</Вид>
<IDD>1004838</IDD>
<Наименование>Дн</Наименование>
</Родитель>
<СтранаПроисхождения>
<Вид>NULL</Вид>
</СтранаПроисхождения>
<НоменклатурнаяГруппа>
<Вид>NULL</Вид>
</НоменклатурнаяГруппа>
<Параметр1>
<Вид>NULL</Вид>
</Параметр1>
<Параметр2>
<Вид>NULL</Вид>
</Параметр2>
<Параметр3>
<Вид>аааалалал</Вид>
<IDD>156764838</IDD>
<Наименование>Дукппн</Наименование>
</Параметр3>
<Параметр4>
<Вид>ввввалалал</Вид>
<IDD>156994838</IDD>
<Наименование>Дуаыван</Наименование>
</Параметр4>
<Параметр5>
<Вид>NULL</Вид>
</Параметр5>
<Параметр6>
<Вид>Справочник._Параметры</Вид>
<IDD>1004811838</IDD>
<Наименование>Двойн</Наименование>
</Параметр6>
<Параметр7>
<Вид>NULL</Вид>
</Параметр7>
<Параметр8>
<Вид>NULL</Вид>
</Параметр8>
<Параметр9>
<Вид>NULL</Вид>
</Параметр9>
<Параметр10>
<Вид>NULL</Вид>
</Параметр10>
<Параметр11>
<Вид>NULL</Вид>
</Параметр11>
<Параметр12>
<Вид>NULL</Вид>
</Параметр12>
<Параметр13>
<Вид>NULL</Вид>
</Параметр13>
<Параметр14>
<Вид>NULL</Вид>
</Параметр14>
<НеВключатьВпрайс>Ложь</НеВключатьВпрайс>
<Услуга>Ложь</Услуга>
<Комментарий></Комментарий>
<НаименованиеПолное></НаименованиеПолное>
</Справочник.Номенклатура>
<Справочник._ОписанияПараметров>
<IDD>10000000562</IDD>
<Код>1</Код>
<Наименование>Модель</Наименование>
<ПометкаУдаления>Ложь</ПометкаУдаления>
<ЭтоГруппа>Ложь</ЭтоГруппа>
<Владелец>
<Вид>Справочник._ТипыТоваров</Вид>
<IDD>1000002193</IDD>
<Наименование>АКСЕССУАРЫ</Наименование>
</Владелец>
</Справочник._ОписанияПараметров>
<Справочник.Номенклатура>
<IDD>1000878340</IDD>
<Код>64842</Код>
<Наименование>Проставка с двойн</Наименование>
<ПометкаУдаления>Ложь</ПометкаУдаления>
<ЭтоГруппа>Ложь</ЭтоГруппа>
<Родитель>
<Вид>Справочник.Номенклатура</Вид>
<IDD>100485</IDD>
<Наименование>АДАПТЕРЫ</Наименование>
</Родитель>
<СтранаПроисхождения>
<Вид>NULL</Вид>
</СтранаПроисхождения>
<НоменклатурнаяГруппа>
<Вид>Справочник.НоменклатурныеГруппы</Вид>
<IDD>1000002193</IDD>
<Наименование>АКСЕССУАРЫ</Наименование>
</НоменклатурнаяГруппа>
<Параметр1>
<Вид>Справочник._Параметры</Вид>
<IDD>1004837</IDD>
<Наименование>Проставка</Наименование>
</Параметр1>
<Параметр2>
<Вид>NULL</Вид>
</Параметр2>
<Параметр3>
<Вид>NULL</Вид>
</Параметр3>
<Параметр4>
<Вид>NULL</Вид>
</Параметр4>
<Параметр5>
<Вид>NULL</Вид>
</Параметр5>
<Параметр6>
<Вид>Справочник._Параметры</Вид>
<IDD>100438</IDD>
<Наименование>Двойн</Наименование>
</Параметр6>
<Параметр7>
<Вид>NULL</Вид>
</Параметр7>
<Параметр8>
<Вид>NULL</Вид>
</Параметр8>
<Параметр9>
<Вид>NULL</Вид>
</Параметр9>
<Параметр10>
<Вид>NULL</Вид>
</Параметр10>
<Параметр11>
<Вид>NULL</Вид>
</Параметр11>
<Параметр12>
<Вид>NULL</Вид>
</Параметр12>
<Параметр13>
<Вид>NULL</Вид>
</Параметр13>
<Параметр14>
<Вид>NULL</Вид>
</Параметр14>
<НеВключатьВпрайс>Истина</НеВключатьВпрайс>
<Услуга>Ложь</Услуга>
<Комментарий></Комментарий>
<НаименованиеПолное>Проставка</НаименованиеПолное>
</Справочник.Номенклатура>
</Данные> # вне тега Данные, теги Справочник.Номенклатура и Справочник._ОписанияПараметров не существуют
</main>

отсюда нужно получить:
из “Справочник.Номенклатура” (в таблицу Nomenclatura)
IDD > iddc
Наименование > namen
Родитель
IDD >idB
НоменклатурнаяГруппа (сначала некоторое содержимое этого тега идет в таблицу TipGroup, затем в таблицу Nomenklatura в поле tipgroup размещается указатель на эту запись в таблице TipGroup)
IDD >iddc
Наименование > namen
Параметр1 (сначала некоторое содержимое этого тега идет в таблицу Par1, затем в таблицу Nomenklatura в поле parameter1 размещается указатель на эту запись в таблице Par1) #и так все Параметры, для каждого параметра создана таблица с соответствующим именем вида Par1, Par2, Par3 и т.п.
IDD >iddc
Наименование > namen

по сути, непонятно только как при таком подходе организовать доступ и чтение последних уровней вложенности, и как рационально организовать возврат указателя на нужную запись в определенной таблице в другую таблицу .
Ed
Aristo.py
отсюда нужно получить:
из “Справочник.Номенклатура” (в таблицу Nomenclatura)
IDD > iddc
Наименование > namen
Родитель
IDD >idB
НоменклатурнаяГруппа (сначала некоторое содержимое этого тега идет в таблицу TipGroup, затем в таблицу Nomenklatura в поле tipgroup размещается указатель на эту запись в таблице TipGroup)
IDD >iddc
Наименование > namen
Параметр1 (сначала некоторое содержимое этого тега идет в таблицу Par1, затем в таблицу Nomenklatura в поле parameter1 размещается указатель на эту запись в таблице Par1) #и так все Параметры, для каждого параметра создана таблица с соответствующим именем вида Par1, Par2, Par3 и т.п.
IDD >iddc
Наименование > namen
Непонятно насчет некоторого содержимого. Как вы представляете я смогу вам запрограммировать это?

Но в целом я не вижу тут проблем для однопроходного варианта.


по сути, непонятно только как при таком подходе организовать доступ и чтение последних уровней вложенности, и как рационально организовать возврат указателя на нужную запись в определенной таблице в другую таблицу .
Все равно не вижу проблемы. Парсинг происходит в один проход. Если нужны некие данные из уже обработанного, то их нужно предварительно сохранить. В чем проблема-то? Может на примере поясните? Вот на этом, который привели.
Aristo.py
Вот все данные, которые нужно выдернуть, все не перечисленные здесь игнорировать:
Aristo.py
“Справочник.Номенклатура” (в таблицу Nomenclatura)
IDD > iddc
Наименование > namen
Родитель
IDD >idB
НоменклатурнаяГруппа (сначала в таблицу TipGroup, затем в таблицу Nomenklatura в поле tipgroup размещается указатель на эту запись в таблице TipGroup)
IDD >iddc
Наименование > namen
Параметр1 (сначала в таблицу Par1, затем в таблицу Nomenklatura в поле parameter1 размещается указатель на эту запись в таблице Par1) #и так все Параметры, для каждого параметра создана таблица с соответствующим именем вида Par1, Par2, Par3 и т.п.
IDD >iddc
Наименование > namen
Код для примера подойдет последний.
Понимаю, как действует, но никак не возьму в толк, как заставить его обрабатывать теги последнего уровня вложенности.
Ed
А в чем принципиальная разница между тэгами последнего уровня и остальными? Парсер парсит все, заходит на все уровни.
Кстати, можете привести пример ‘тэга последнего уровня’ и сформулировать таки в чем проблема с ними?
Aristo.py
Ed
А в чем принципиальная разница между тэгами последнего уровня и остальными? Парсер парсит все, заходит на все уровни.
Кстати, можете привести пример ‘тэга последнего уровня’ и сформулировать таки в чем проблема с ними?
у меня почему то не выводит… щас пошаманю, посмотрим…
Будет правильно, если :
writer = DBWriter({u“Справочник.Номенклатура”: {“table”: “Nomencl”,
“fields”: {u“IDD”: “IDD”,
u“Наименование”: “name”,
u“Родитель”:{“table”:“TipGroup”,
u“IDD”:“idB”,
u“Наименование”:“namen”},
u“Параметр1”::{“table”:“Par1”,
u“IDD”:“idB”,
u“Наименование”:“namen”},
}})
??????
Ed
Да, выглядит нормально.
Aristo.py
Подскажите как туда поставить условия проверки на наличие такой записи в таблице перед тем как ее создать?
А также как после добавления записи (к примеру) Параметр1(его IDD и Наименование) в таблицу Par1 вернуть указатель на эту запись в таблице Nomenclatura в поле par1?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB