Поиск по xml-файлу
Пишу программу по реализации алгоритмов по графам(поиск в ширину и т.д)
Писал функцию поиска соседних вершин, но выдает ошибку
Traceback (most recent call last):
File "C:\Users\USER\Desktop\ia_algoritm\algoritm.py", line 60, in <module>
a = neighbour(graph,p)
File "C:\Users\USER\Desktop\ia_algoritm\algoritm.py", line 29, in neighbour
edge = graph_[i].attrib
KeyError: 0
def neighbour(filename,node):
niegh = []
tree = ET.parse(filename)
root = tree.getroot()
graph_ = root[2].attrib
for i in range(0,47):
edge = graph_[i].attrib
source = edge.get('source')
target = edge.get('target')
if (source == node):
niegh.append(target)
return niegh
p = start(graph)
a = neighbour(graph,p)
print(a)
xml-файл
<?xml version="1.0" encoding="UTF-8"?>
<root>
<algorithm type="dijkstra"/>
<task start.id="A" goal.id="L"/>
<graph type="general">
<edge source="A" target="B" weight="3"/>
<edge source="B" target="A" weight="3"/>
<edge source="A" target="C" weight="5"/>
<edge source="C" target="A" weight="5"/>
<edge source="A" target="D" weight="4"/>
<edge source="D" target="A" weight="4"/>
<edge source="B" target="E" weight="5"/>
<edge source="E" target="B" weight="5"/>
<edge source="C" target="F" weight="3"/>
<edge source="F" target="C" weight="3"/>
<edge source="D" target="F" weight="4"/>
<edge source="F" target="D" weight="4"/>
<edge source="D" target="E" weight="3"/>
<edge source="E" target="D" weight="3"/>
<edge source="D" target="G" weight="6"/>
<edge source="G" target="D" weight="6"/>
<edge source="E" target="G" weight="4"/>
<edge source="G" target="E" weight="4"/>
<edge source="E" target="J" weight="7"/>
<edge source="J" target="E" weight="7"/>
<edge source="F" target="G" weight="5"/>
<edge source="G" target="F" weight="5"/>
<edge source="F" target="H" weight="6"/>
<edge source="H" target="F" weight="6"/>
<edge source="G" target="H" weight="7"/>
<edge source="H" target="G" weight="7"/>
<edge source="G" target="J" weight="4"/>
<edge source="J" target="G" weight="4"/>
<edge source="H" target="I" weight="4"/>
<edge source="I" target="H" weight="4"/>
<edge source="I" target="K" weight="8"/>
<edge source="K" target="I" weight="8"/>
<edge source="I" target="L" weight="4"/>
<edge source="L" target="I" weight="4"/>
<edge source="J" target="K" weight="6"/>
<edge source="K" target="J" weight="6"/>
<edge source="J" target="N" weight="5"/>
<edge source="N" target="J" weight="5"/>
<edge source="K" target="L" weight="2"/>
<edge source="L" target="K" weight="2"/>
<edge source="K" target="M" weight="3"/>
<edge source="M" target="K" weight="3"/>
<edge source="K" target="N" weight="3"/>
<edge source="N" target="K" weight="3"/>
<edge source="L" target="M" weight="4"/>
<edge source="M" target="L" weight="4"/>
<edge source="M" target="N" weight="4"/>
<edge source="N" target="M" weight="4"/>
</graph>
Ответы (2 шт):
Автор решения: AndroID
→ Ссылка
Не совсем понимаю, что вы хотите сделать, но я написал программу, которая ищет в вашем xml-файле указанный source и возвращает все подходящие target.
from re import findall
def search(fname, node):
r = []
with open(fname, "r", encoding = "utf-8") as f :
for line in f :
if line.startswith("\t\t") :
parts = findall(r"\S+", line)[1 :]
parts[-1] = parts[-1][: -2] if parts[-1].endswith("/>") else parts[-1][: -1]
tags = dict()
for part in parts :
splitted = part.split("=")
tags.update({splitted[0]: splitted[1][1 : -1]})
if tags["source"] == node :
r += [tags["target"]]
return r
fname = "file.xml"
print(search(fname, "E"))
# ['B', 'D', 'G', 'J']
Автор решения: gil9red
→ Ссылка
Поле attrib -- возвращает атрибуты элемента, а root[2] это <graph type="general">:
graph_ = root[2].attrib
# {'type': 'general'}
Для перебора детей graph используйте итерацию по циклу.
Попробуйте:
from xml.etree import ElementTree as ET
def neighbour(filename, node):
niegh = []
tree = ET.parse(filename)
root = tree.getroot()
graph = root[2]
for edge in graph:
source = edge.get('source')
target = edge.get('target')
if source == node:
niegh.append(target)
return niegh
graph = 'graph.xml'
a = neighbour(graph, 'A')
print(a)
# ['B', 'C', 'D']