Найти - Пользователи
Полная версия: Многоуровневый анализ XML через SAX
Начало » Python для экспертов » Многоуровневый анализ XML через SAX
1 2 3 4 5
Ed
Это зависит от таблицы и базы, которые у вас там используются. Я не в курсе. Что такое указатель на запись тоже сильно зависит от того, с чем вы работаете.
Weaving Hair
А в чем принципиальная разница между тэгами последнего уровня и остальными? Парсер парсит все, заходит на все уровни.

mediafire movies download
Aristo.py
Weaving Hair
А в чем принципиальная разница между тэгами последнего уровня и остальными? Парсер парсит все, заходит на все уровни.
не обращайте внимания - это мой временный тупняк.
Aristo.py
Ed
Это зависит от таблицы и базы, которые у вас там используются. Я не в курсе. Что такое указатель на запись тоже сильно зависит от того, с чем вы работаете.
Работаю пока с обычной бд. Все таблицы пока пусты, данные там будет накапливаться только с данного xml. мне не столько волнует выбор инструментов, сколько принцип работы. Инструменты можно подобрать, а вот с механизмом - сложнее.
Как поставить условие проверки на наличие всех записей в таблицах перед тем как ее заполнять поле?
Aristo.py
Ed
Это зависит от таблицы и базы, которые у вас там используются. Я не в курсе. Что такое указатель на запись тоже сильно зависит от того, с чем вы работаете.
я правильно понимаю, что лучше всего поиск по idc (в таблицах Par1 - 14 и таблице TipGroup) будет лучше разместить в классе DBWriter и запускать проверку каждый раз, как только он будет начинать писать это поле?
Ed
Aristo.py
Работаю пока с обычной бд.
С обычной стало быть. Ну хорошо, хоть с обычной :). А поконкретнее можно? Я необычных бд не очень много знаю, а вот обычных явно не одну.
Ed
Aristo.py
я правильно понимаю, что лучше всего поиск по idc (в таблицах Par1 - 14 и таблице TipGroup) будет лучше разместить в классе DBWriter и запускать проверку каждый раз, как только он будет начинать писать это поле?
В целом я не понял, но повторюсь - это зависит от бд, с которой вы работаете. Во многих можно, например, задать уникальность содержимого поля или нескольких полей на уровне бд. Именно поэтому ответ на ваш вопрос зависит от того, какую бд вы используете, а постановка вопроса без указания бд не имеет смысла.
Aristo.py
БД GQL.
Объясните, пожалуста еще:

from xml.sax.handler import ContentHandler - импортируем нужную библиотеку
from xml import sax - импортируем нужную библиотеку

class Handler(ContentHandler): - класс - потоковый парсер xml
def __init__(self, fields, callback): - инициализация. тут не понятно какую роль играет callback, и не до конца понятно как используется fields
ContentHandler.__init__(self) - сам себя переопределяет или уточняет что он всеже contenthandler ?
self.results = dict() - определение переменной self.results как именованные словарь (так?) с неопределенном (пока не определен fields ) количеством переменных.
self.callback = callback - не понятно использование
self.target = None - не понятно использование
self.current = None - совсем не понятно назначение

def startElement(self, name, attrs): - определяем метод начала разбора
self.current = name - зачем на этом этапе ставить self.current = name?
if name in self.results: - условие: встречается ли текущий name (тэг) в словаре self.result, то
self.target = name - упаковываем этот тэг в переменную self.target, что бы characters изымала внутренности текущего тэга

def endElement(self, name): - определение метода окончания анализа
self.current = None - никак в толк не возьму зачем это.
if name in self.results:- условие: если name (тэг) есть в словаре self.results то
self.callback(self.target, self.results) - что вообще твориться в этой строке?
self.results = {} - а здесь что происходит?
self.target = None - self.target в методе characters учавствует в условии, поэтому пока в self.target что то лежит, он будет записывать значение текущего нода в словарь под его именем, тут идет окончание анализа, поэтому его опустошают.

def characters(self, content): определение метода записи содежимого нодов
if self.target: – условие: если self.target не None (т.е. мы внутри нода) , то
self.results = content -не могу понять. совсем не усваивается.

class DBWriter(): - класс записи в БД
def __init__(self, rules): инициализация класса
self.rules = rules - какую роль тут играет rules

def write(self, name, data): - определение метода записи в бд
rules = self.rules - это определение списка полей?
print “Пришло”, name
print “Пишем в таблицу ‘%s’” % rules
for key, fname in rules.iteritems(): - я так понимаю, что это цикл с предусловием в котором говориться: “если key и fname содержатся в списке rules, который берет элементы своего списка из fields.iteritems(), то…” зачем здесь iteritems()? и кто такой key ?
print “В поле”, fname, “запишем”, data - fname - понятно, видимо сокращенно от fields name - имена полей.так?…как содержимое списка попадает в data?
print “”

if __name__ == ‘__main__’:

writer = DBWriter({u“Справочник.Номенклатура”: {“table”: “Nomencl”, - передаем список классу записи в БД
“fields”: {u“IDD”: “IDD”,
u“Наименование”: “name”,
u“Родитель”:{“table”:“TipTovara”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр1”:{“table”:“Param1”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр2”:{“table”:“Param2”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр3”:{“table”:“Param3”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр4”:{“table”:“Param4”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр5”:{“table”:“Param5”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр6”:{“table”:“Param6”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр7”:{“table”:“Param7”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр8”:{“table”:“Param8”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр9”:{“table”:“Param9”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр10”:{“table”:“Param10”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр11”:{“table”:“Param11”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр12”:{“table”:“Param12”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр13”:{“table”:“Param13”,
u“IDD”:“idBoss”,
u“Наименование”:“name”},
u“Параметр14”:{“table”:“Param14”,
u“IDD”:“idBoss”,
u“Наименование”:“name”}}},
u“Справочник._ОписанияПараметров”: {“table”: “OpisParam”,
“fields”: {u“IDD”: “idd1c”,
u“Код”: “num_par”,
u“Наименование”: “name”,
u“Владелец”:{“table”: “TipTovara”,
u“IDD”:“idBoss”,
u“Наименование”:“name”}}}})
parser = sax.make_parser() - создаем поток парсера
handler = Handler((u“Справочник.Номенклатура”, u“Справочник._ОписанияПараметров” ), writer.write) - определяем что нам нужно обработать. зачем тут write.write?
parser.setContentHandler(handler) - передаем список того что нам нужно обработать
parser.parse(“for_web.xml”) парсим файл
Знаю, я- тупица. но объясните пожалуйста эти нюансы, или дайте указания какие из них хорошо объясняются в книгах (каких).
Aristo.py
Очень прошу: Более подробно прокомментируйте вашу программу. вопросы к ней в предыдущем сообщении.
kmike
А обязательно нужен именно SAX? iterparse тоже в память не грузит весь документ, он поудобнее и даже часто быстрее.
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