2017-02-20 2 views
1

Ich habe eine XML-Struktur, die ich suchen müssen:Python lxml - nicht bekommen Eltern

<instance> 
    <hostName>hostname1</hostName> 
    <port enabled="true">9010</port> 
    <metadata> 
     <branch>master</branch> 
    </metadata> 
    <vipAddress>vip.address.com</vipAddress> 
</instance> 
<instance> 
    <hostName>hostname2</hostName> 
    <port enabled="true">9011</port> 
    <metadata> 
     <branch>sub_branch</branch> 
    </metadata> 
    <vipAddress>vip2.address.com</vipAddress> 
</instance> 

Ich versuche, eine Suche über den Text im Zweig zu tun, dann die Großeltern Element erhalten und bekommen die vipAddress und port aber wenn ich den Code unten verwenden, wenn ich versuche, die vipAddress drucken und die port druckt alle von ihnen statt dem, die ich für wirklich war auf der Suche:

branch_name = 'master'  
for record in tree.xpath('//branch/text()'): 
    if(record == branch_name): 
    branch = record.getparent() 
    target_environment = branch.xpath('//vipAddress/text()') 
    print(target_environment) 
    target_port = branch.xpath('//port/text()') 

Beispiel:

Wenn ich für master suchen statt target_environment=vip.address.com und port=9011 Rückkehr wird es zurückkehren target_environment=[vip.address.com, vip2.address.com] und port=[9010,9011]

Ich bin sicher, dass ich etwas einfach falsch mache ich kann einfach nicht sehen, was.

Antwort

1

Ich bin nicht die beste mit xml in Python zu arbeiten, aber ich habe ein paar Probleme sehen:

for record in tree.xpath('//branch/text()'): konvertieren Ihre Zweigelemente auf Zeichenfolge, die Sie weiter unten verwenden, um branch_name zu vergleichen. Strings haben keine getparent() Methode, so dass Sie die text() von XPath entfernen wollen und vergleichen branch_name-record.text

Sobald Ihr record ein Element ist, getparent() zweimal aktenkundig Aufruf werden Sie geben es Großeltern Element instance. Ich bin mir sicher, dass es einen besseren Weg dafür gibt, aber es scheint zu funktionieren.

.xpath('//') sucht nach Elementen, die mit der Abfrage übereinstimmen. Da soll nur das Element, das ein Kind von <instance> ist, branch.xpath('vipAddress/text()') tun soll. Dasselbe gilt für das Finden des target_port.

Auch ich denke, .xpath immer eine Liste, so dass selbst wenn diese alle Ihre port funktioniert wie [9011] es zusammen

Putting ich so etwas wie aussehen:

branch_name = 'master' 
for record in tree.xpath('//branch'): 
    if(record.text == branch_name): 
    branch = record.getparent().getparent() 
    target_environment = branch.xpath('vipAddress/text()') 
    print(target_environment) 
    target_port = branch.xpath('port/text()') 
    print(target_port) 
+0

Dank, das funktioniert super! – len