Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 3, 2007 19:35:36

umup
От:
Зарегистрирован: 2007-07-14
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

обход дерева XML

нужно пройти дерево одинаковых вложенных элементов, на выходе получить массив строк типа :
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 обходит одновременно все элементы, непонятно как определить их вложенность



Офлайн

#2 Окт. 4, 2007 09:05:53

Jenyay
От:
Зарегистрирован: 2007-08-10
Сообщения: 173
Репутация: +  1  -
Профиль   Отправить e-mail  

обход дерева XML

Можно рекурсивно получать список детей через childNodes.



Офлайн

#3 Окт. 4, 2007 10:44:40

Yurietc
От:
Зарегистрирован: 2007-07-18
Сообщения: 112
Репутация: +  0  -
Профиль   Отправить e-mail  

обход дерева XML

Попробуй BeautifulSoup



Отредактировано (Окт. 4, 2007 10:45:13)

Офлайн

#4 Окт. 4, 2007 13:28:09

umup
От:
Зарегистрирован: 2007-07-14
Сообщения: 53
Репутация: +  0  -
Профиль   Отправить e-mail  

обход дерева XML

сделал через minidom childNodes



Офлайн

#5 Окт. 5, 2007 10:47:36

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

обход дерева XML

Не знаю, в чем состоит изначальная постановка задачи, но если она сводиться к таким стандартным задачам, как парсинг конфигурационного файла и пр., возможно стоит обратить свой взор в сторону XPath.



Офлайн

#6 Фев. 4, 2008 16:20:40

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

обход дерева XML

Всем привет. Впервые на Питоне попробовал 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)

Офлайн

#7 Фев. 4, 2008 18:53:30

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

обход дерева XML

Вот об этом, примерно, и был мой пост выше:
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. В любом случае - если есть дерево, которое нужно обойти, то лучше восспользоваться рекурсией (иф - это фи :)



Офлайн

#8 Фев. 4, 2008 18:55:55

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

обход дерева XML

P.S. Соре, код, который я тут напостил - не тестил - может отвалиться чего-нибудь… Просто для демонстрации, привел.. Ж)



Офлайн

#9 Фев. 5, 2008 16:57:53

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

обход дерева XML

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. В любом случае - если есть дерево, которое нужно обойти, то лучше восспользоваться рекурсией (иф - это фи :)
А как тут к парентам обращаться? Просто, мне необходимо знать, кто парент, чтобы знать, какие строки и куда парсить.



Офлайн

#10 Фев. 5, 2008 18:06:54

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

обход дерева XML

В данном случае парент - group node. Однако, при помощи семантики xpath можно получить __любую__ информацию о любом ноде (чего, ксати, нельзя сделать быстро, просто обходя дерево). В частности, парента можно найти используя ось ancestor. Подробнее здесь: http://www.w3schools.com/xpath/xpath_axes.asp (а вообще - литературы на эту тему - огромные кучи =)



Отредактировано (Фев. 5, 2008 18:07:19)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version