使用XML数据在Python中创建网络

0 投票
2 回答
897 浏览
提问于 2025-04-18 04:35

我这里有一个 .xml 文件,链接是:http://sndlib.zib.de/coredata.download.action?objectName=germany50&format=xml&objectType=network

我想用 Python 来读取这个文件里的属性,以便创建一个网络。我只成功读取了属性,但接下来该怎么做我完全不知道。我需要用这个 .xml 文件里的数据来创建一个双向网络。我的 Python 代码是这样的。有没有人能帮帮我?

谢谢!

import sys
import xml.dom.minidom as dom 
import string
from xml.dom import minidom
from xml.dom.minidom import parse
import os
Read_Data = minidom.parse("germany50.xml")
nodelist = Read_Data.getElementsByTagName("node")
for node in nodelist :
    if node.hasAttribute("id"):
        Node = node.getAttribute("id")
    xCoordinates = node.getElementsByTagName('x') [0]
    yCoordinates = node.getElementsByTagName('y') [0]
    print "%s : %s %s" %(node.getAttribute("id"), xCoordinates.childNodes[0].data, yCoordinates.childNodes[0].data)

linklist = Read_Data.getElementsByTagName("link")
for link in linklist :
    if link.hasAttribute("id"):
        Link = link.getAttribute("id")
    Source = link.getElementsByTagName('source') [0]
    Destination = link.getElementsByTagName('target') [0]
    Capacity = link.getElementsByTagName('capacity') [0]
    print "%s - %s to %s: %s" %(link.getAttribute("id"), Source.childNodes[0].data, Destination.childNodes[0].data, Capacity.childNodes[0].data)
demandlist = Read_Data.getElementsByTagName("demand")
for demand in demandlist :
    if demand.hasAttribute("id"):
        Demand = demand.getAttribute("id")
    Source = demand.getElementsByTagName('source') [0]
    Destination = demand.getElementsByTagName('target') [0]
    Demand = demand.getElementsByTagName('demandValue') [0]
    print "%s needs %s" %(demand.getAttribute("id"), Demand.childNodes[0].data)

2 个回答

1
for link in linklist :
    if link.hasAttribute("id"):
        Linkid = link.getAttribute("id")
    Source = link.getElementsByTagName('source') [0]
    Destination = link.getElementsByTagName('target') [0]
    Capacity = link.getElementsByTagName('capacity') [0]
    linkobj= Link(Linkid,Source,Destination,Capacity)
    if nodemap.has_key(Source):
        nodemap[Source].linklist.append(linkobj)
    if nodemap.has_key(Destination):
        nodemap[Destination].linklist.append(linkobj)

请注意,你可能忽略了一种情况,那就是你的节点列表可能包含 [A,B,C,D],而你的链接可能包含 [(A,C),(B,E)]。在这种情况下,你需要先创建一个节点 E,然后再建立链接。我注意到在给定的 XML 中存在这种情况,上面也提供了处理方法。

2

要在Python中创建一个网络,你需要用到面向对象编程(OOPS)的概念。下面的代码大概是这样的。

nodemap是一个包含每个节点的地图,而这些节点通过链接和需求相互连接。

import sys
import xml.dom.minidom as dom 
import string
from xml.dom import minidom
from xml.dom.minidom import parse
import os
Read_Data = minidom.parse("germany50.xml")
nodelist = Read_Data.getElementsByTagName("node")

class Node:
    def __init__(self,uid,x,y):
        self.uid=uid
        self.x=x
        self.y=y
        self.linklist=[]
        self.demandlist=[]

class Link:
    def __init__(self,uid,source,target,capacity):
        self.uid=uid
        self.source=source
        self.target=target
        self.capacity=capacity

class Demand:
    def __init__(self,uid,source,destination,demandValue):
        self.uid=uid
        self.source=source
        self.destination=destination
        self.demandValue=demandValue


nodemap={}

for node in nodelist :
    if node.hasAttribute("id"):
        Nodeid = node.getAttribute("id")
    xCoordinates = node.getElementsByTagName('x') [0]
    yCoordinates = node.getElementsByTagName('y') [0]
    nodemap[Nodeid]=Node(Nodeid,xCoordinates,yCoordinates)
    print "%s : %s %s" %(node.getAttribute("id"), xCoordinates.childNodes[0].data, yCoordinates.childNodes[0].data)

linklist = Read_Data.getElementsByTagName("link")
for link in linklist :
    if link.hasAttribute("id"):
        Linkid = link.getAttribute("id")
    Source = link.getElementsByTagName('source') [0]
    Destination = link.getElementsByTagName('target') [0]
    Capacity = link.getElementsByTagName('capacity') [0]
    linkobj= Link(Linkid,Source,Destination,Capacity)
    if nodemap.has_key(Source):
        nodemap[Source].linklist.append(linkobj)
    if nodemap.has_key(Destination):
        nodemap[Destination].linklist.append(linkobj)

    print "%s - %s to %s: %s" %(link.getAttribute("id"), Source.childNodes[0].data, Destination.childNodes[0].data, Capacity.childNodes[0].data)
demandlist = Read_Data.getElementsByTagName("demand")
for demand in demandlist :
    if demand.hasAttribute("id"):
        Demandid = demand.getAttribute("id")
    Source = demand.getElementsByTagName('source') [0]
    Destination = demand.getElementsByTagName('target') [0]
    Demandval = demand.getElementsByTagName('demandValue') [0]
    demandobj=Demand(Demandid,Source,Destination,Demandval)
    if nodemap.has_key(Source):
        nodemap[Source].demandlist.append(demandonj)
    if nodemap.has_key(Destination):
        nodemap[Destination].demandlist.append(demandobj)

    print "%s needs %s" %(demand.getAttribute("id"), Demandval.childNodes[0].data)




print nodemap

建议你先了解一下Python中的面向对象编程概念,这样你就能明白如何在Python中构建网络、图和树。

希望这对你有帮助。

撰写回答