2011-08-05 17 views
0

私はxmlとminidomを理解していますが、何かが欠けています。私がしたいことは、可変サイズのXMLファイルを解析し、要素のツリーを構築できることです。XML DOM解析。

<doc> 
<foo> 
    <server> 
     <ip>10.1.1.1</ip> 
     <service>service1</service> 
     <name>somename</name> 
     <something>sometext</something> 
    </server> 
</foo> 
<foo> 
    <server> 
     <ip>10.1.1.2</ip> 
     <service>service2</service> 
     <name>other</name> 
     <something>link</something> 
    </server> 
</foo> 
<foo> 
<server> 
     <ip>10.1.1.3</ip> 
     <service>service2</service> 
     <name>other2</name> 
     <something>link</something> 
    </server> 
</foo> 
</doc> 

この例を見てみましょう今私は木を解析し、インスタンス・サービスは、一部のサーバーに属しているためので、関連付けを取得できるようにしたいです。 IPはこれに属しています。私はツリーを維持したい(サーバーをキーにして)、すべての要素を保管しておきたい。私はまた、すべてのサーバでサービスを検索したり、すべてのIPを表示できるようにしたいと考えています.etc.etc ..

私は辞書を構築する必要がありますが、私はどのように構築できるか分かりません私はすべてが単一のキーに基づいているネストされた辞書です。

答えて

0

ここに私のクイックコードがあります。 私は要素の実装のリストとサーバー実装のリスト(+ get_dict())を持っています。これはafaikの質問に基づいて必要なものでなければなりません。

import lxml.etree as etree 

class server(object): 
    def __init__(self): 
     self.ip = '' 
     self.service = '' 
     self.name = '' 
     self.something = '' 
    def get_dict(self): 
     return {self:{'ip':self.ip,'service':self.service,'name':self.name,'something':self.something}} 

class serverlist(object): 
    def __init__(self): 
     self.servers = [] 
    def addserver(self,serverobject): 
     if serverobject not in self.servers: 
      self.servers.append(serverobject) 
    def removeserver(self,serverobject): 
     for s in self.servers: 
      if s.get_dict() == serverobject.get_dict(): 
       self.servers.remove(s) 
    def findserver(self,valueid,value): 
     for s in self.servers: 
      if s.get_dict()[s][valueid] == value: 
       return s 
     return None 

xml = etree.fromstring(r'''<xml><foo> 
    <server> 
     <ip>10.1.1.1</ip> 
     <service>service1</service> 
     <name>somename</name> 
     <something>sometext</something> 
    </server> 
</foo> 
<foo> 
    <server> 
     <ip>10.1.1.2</ip> 
     <service>service2</service> 
     <name>other</name> 
     <something>link</something> 
    </server> 
</foo> 
<foo> 
<server> 
     <ip>10.1.1.3</ip> 
     <service>service2</service> 
     <name>other2</name> 
     <something>link</something> 
    </server> 
</foo></xml>''') 

#servers as a list of items (class server) 
servers1 = [] 
for s in list(xml): 
    tempserver = server() 
    tempserver.ip=s.find('.//ip').text 
    tempserver.service=s.find('.//service').text 
    tempserver.name = s.find('.//name').text 
    tempserver.something = s.find('.//something').text 
    servers1.append(tempserver) 
print servers1 

#servers as a list of elements 
servers2 = xml.xpath('.//server') 
print servers2