Форум сайта python.su
нужно пройти дерево одинаковых вложенных элементов, на выходе получить массив строк типа :
1
1.2
1.3
1.4
1.4.5
<sections>
<section tags=“1”>
<section tags=“2”>
</section>
<section tags=“3”>
</section>
<section tags=“4”>
<section tags=“5”>
</section>
</section>
</section>
</sections>
getElementsByTagName обходит одновременно все элементы, непонятно как определить их вложенность
Офлайн
Можно рекурсивно получать список детей через childNodes.
Офлайн
Офлайн
сделал через minidom childNodes
Офлайн
Не знаю, в чем состоит изначальная постановка задачи, но если она сводиться к таким стандартным задачам, как парсинг конфигурационного файла и пр., возможно стоит обратить свой взор в сторону XPath.
Офлайн
Всем привет. Впервые на Питоне попробовал XML попарсить, чтобы вытянуть нужные данные. Суть: мне надо взять все параметры из группы SQLServerSettings и CallSettings и распихать их по нужным ячейкам. Можете сказать, нормальный ли код или что-то лучше изменить?
XML:
<?xml version=“1.0” encoding=“UTF-8”?>
<settings>
<group name=“SQLServerSettings”>
<param name=“ServerName”>sql.local</param>
<param name=“UserName”>user1</param>
<param name=“Password”>pass1</param>
<param name=“DBName”>simpleDB</param>
</group>
<group name=“CallSettings”>
<param name=“GroupsPath”>d:/group/</param>
<param name=“CorpPath”>d:/corp/</param>
<param name=“XlsPath”>xls</param>
<param name=“CorpCode”>222</param>
<param name=“CorpPrice”>1</param>
<param name=“OtherPrice”>2</param>
</group>
</settings>
Python:
def output_tree1(node, level=0):
try:
parentNode = node.parentNode.attributes.items ()
if parentNode == “SQLServerSettings”:
tmpVar = node.attributes.items ()
for tmpChild in tmpVar:
print “. ” * level, tmpChild
if node.childNodes .nodeValue.strip ():
print “. ” * (level + 1), node.childNodes .nodeValue.strip ()
elif parentNode == “CallSettings”:
tmpVar = node.attributes.items ()
for tmpChild in tmpVar:
print “. ” * level, tmpChild
if node.childNodes .nodeValue.strip ():
print “. ” * (level + 1), node.childNodes .nodeValue.strip ()
except:
pass
for child in node.childNodes:
output_tree1(child, level+1)
output_tree1(dom)
Отредактировано (Фев. 4, 2008 16:41:54)
Офлайн
Вот об этом, примерно, и был мой пост выше:
From Ft.Xml import Parse
dom = Parse(path)
groupList = dom.xpath('//group')
for group in groupList:
print ‘group begin %s’ %group.xpath('string(./@name)')
params = group.xpath('./param')
for param in params:
name = param.xpath('string(./@name)')
value = param.xpath('string(.)')
print ‘ param %s=%s’ %(name, value)
Хм.. Даже если предпочтителен стандартный дом (ну.. по разным причинам), функция out_tree1 не годиться - в ней явно дублируються куски для CallSetting и SQLServerSetting. В любом случае - если есть дерево, которое нужно обойти, то лучше восспользоваться рекурсией (иф - это фи :)
Офлайн
P.S. Соре, код, который я тут напостил - не тестил - может отвалиться чего-нибудь… Просто для демонстрации, привел.. Ж)
Офлайн
ZANА как тут к парентам обращаться? Просто, мне необходимо знать, кто парент, чтобы знать, какие строки и куда парсить.
Вот об этом, примерно, и был мой пост выше:
From Ft.Xml import Parse
dom = Parse(path)
groupList = dom.xpath('//group')
for group in groupList:
print ‘group begin %s’ %group.xpath('string(./@name)')
params = group.xpath('./param')
for param in params:
name = param.xpath('string(./@name)')
value = param.xpath('string(.)')
print ‘ param %s=%s’ %(name, value)
Хм.. Даже если предпочтителен стандартный дом (ну.. по разным причинам), функция out_tree1 не годиться - в ней явно дублируються куски для CallSetting и SQLServerSetting. В любом случае - если есть дерево, которое нужно обойти, то лучше восспользоваться рекурсией (иф - это фи :)
Офлайн
В данном случае парент - group node. Однако, при помощи семантики xpath можно получить __любую__ информацию о любом ноде (чего, ксати, нельзя сделать быстро, просто обходя дерево). В частности, парента можно найти используя ось ancestor. Подробнее здесь: http://www.w3schools.com/xpath/xpath_axes.asp (а вообще - литературы на эту тему - огромные кучи =)
Отредактировано (Фев. 5, 2008 18:07:19)
Офлайн