Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 6, 2009 22:18:50

NoN
От:
Зарегистрирован: 2008-04-28
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

разбор файла с помощью xml.dom.minidom.

Функция нормально разберает xml в словари, если xml файл записан в одну строку, иначе результат не предсказуем.
подскажите вчем проблема?

<a><b>blablabla</b></a> -разберет нормально. результат:

{'A': {'B': 'blalbalb'}}
:
<a>
<b>blabla</b> -корректно не разберет
</a>

код
from xml.dom.minidom import parse
def Test(dom):
obj={}
for node in dom.childNodes:
if node.nodeType==node.TEXT_NODE:
return node.data
if node.nodeType==node.ELEMENT_NODE:
obj[node.nodeName]=Test(node)
return obj
print(Test(parse(open(r'c:\1.txt'))))



Отредактировано (Окт. 6, 2009 22:19:11)

Офлайн

#2 Окт. 6, 2009 22:29:22

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

разбор файла с помощью xml.dom.minidom.

Я так полагаю, что указанный ниже пример (кривой, но наглядный) поможет разобраться:

>>> xml1 = "<a><b>\n<v>sad</v></b></a>"
>>> parsed = parseString(xml1)
>>> parsed.childNodes
[<DOM Element: a at 0xc1a788>]
>>> parsed.childNodes[0].childNodes
[<DOM Element: b at 0xc1a800>]
>>> parsed.childNodes[0].childNodes[0].childNodes
[<DOM Text node "
">, <DOM Element: v at 0xc1a8a0>]
>>>
Дело в том, что символ перевода строки “\n” воспринимается как TEXT_NODE, поэтому конечный словарь выглядит некрасиво.



Офлайн

#3 Окт. 6, 2009 22:35:41

NoN
От:
Зарегистрирован: 2008-04-28
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

разбор файла с помощью xml.dom.minidom.

А как это можно обойти? без редактирования файла.
В голову, кроме как проверять нет ли в ноде других элементов, нечего не приходит.

from xml.dom.minidom import parse
def Test(dom):
obj={}
for node in dom.childNodes:
if node.nodeType==node.TEXT_NODE:
for child in node.parentNode.childNodes:
if child.nodeType==child.ELEMENT_NODE:
break
else:
return node.data
if node.nodeType==node.ELEMENT_NODE:
obj[node.nodeName]=Test(node)
return obj
print(Test(parse(open(r'c:\1.txt'))))



Отредактировано (Окт. 6, 2009 22:48:12)

Офлайн

#4 Окт. 6, 2009 23:24:42

Lolka
От:
Зарегистрирован: 2007-09-29
Сообщения: 128
Репутация: +  0  -
Профиль   Отправить e-mail  

разбор файла с помощью xml.dom.minidom.

А может все таки лучше ElementTree?



Офлайн

#5 Окт. 7, 2009 00:41:15

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

разбор файла с помощью xml.dom.minidom.

Lolka
А может все таки лучше ElementTree?
Да, согласен, минидом очень удобный для небольших XML-файлов, структура и формат подачи которых известен заранее, в этом случае минидом не сильно удобный.



Офлайн

#6 Окт. 7, 2009 10:14:50

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

разбор файла с помощью xml.dom.minidom.

Можно попробовать воспользоваться врапером: http://code.activestate.com/recipes/157358/

ЗЫ. сам не пробовал, пользуюсь ElementTree или lxml, в зависимости от того, что нужно делать с документом



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version