Форум сайта python.su
Функция нормально разберает xml в словари, если xml файл записан в одну строку, иначе результат не предсказуем.
подскажите вчем проблема?
<a><b>blablabla</b></a> -разберет нормально. результат:
{'A': {'B': 'blalbalb'}}
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)
Офлайн
Я так полагаю, что указанный ниже пример (кривой, но наглядный) поможет разобраться:
>>> 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>]
>>>
Офлайн
А как это можно обойти? без редактирования файла.
В голову, кроме как проверять нет ли в ноде других элементов, нечего не приходит.
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)
Офлайн
А может все таки лучше ElementTree?
Офлайн
LolkaДа, согласен, минидом очень удобный для небольших XML-файлов, структура и формат подачи которых известен заранее, в этом случае минидом не сильно удобный.
А может все таки лучше ElementTree?
Офлайн
Можно попробовать воспользоваться врапером: http://code.activestate.com/recipes/157358/
ЗЫ. сам не пробовал, пользуюсь ElementTree или lxml, в зависимости от того, что нужно делать с документом
Офлайн