Найти - Пользователи
Полная версия: разбор файла с помощью xml.dom.minidom.
Начало » Python для новичков » разбор файла с помощью xml.dom.minidom.
1
NoN
Функция нормально разберает 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'))))
regall
Я так полагаю, что указанный ниже пример (кривой, но наглядный) поможет разобраться:
>>> 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, поэтому конечный словарь выглядит некрасиво.
NoN
А как это можно обойти? без редактирования файла.
В голову, кроме как проверять нет ли в ноде других элементов, нечего не приходит.
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'))))
Lolka
А может все таки лучше ElementTree?
regall
Lolka
А может все таки лучше ElementTree?
Да, согласен, минидом очень удобный для небольших XML-файлов, структура и формат подачи которых известен заранее, в этом случае минидом не сильно удобный.
pyuser
Можно попробовать воспользоваться врапером: http://code.activestate.com/recipes/157358/

ЗЫ. сам не пробовал, пользуюсь ElementTree или lxml, в зависимости от того, что нужно делать с документом
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