2017-02-20 6 views
1

に得ることができない私は、私が検索する必要があるXMLツリーがあります。Pythonのlxmlの - 親

<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> 

を私は、祖父母の要素を取得し、取得ブランチ内のテキストを経由して検索を実行しようとしていますvipAddressportが、私は、私がしようとすると、以下のコードを使用してvipAddressportを印刷するとき、それは私が実際に探していた1の代わりに、それらのすべてを印刷します

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()') 

例:

私が代わりにtarget_environment=vip.address.comport=9011を返すのでmasterを検索するためだった場合、それは私が、私はシンプルな間違った私は何を見ることができない何かをやっていると確信して​​とport=[9010,9011]

を返します。

答えて

1

私はPythonでXMLを扱う最高の状態ではないんだけど、私はいくつかの問題を参照してください:

for record in tree.xpath('//branch/text()'):あなたはbranch_nameに比較するために、さらにダウン使用した文字列のために、分岐要素を変換します。あなたは、XPathからtext()を削除したいとbranch_namerecordが要素であるあなた一度

record.textに比較することができるので、文字列は、それが祖父母要素instanceだあなたを与える記録に二回getparent()を呼び出し、getparent()方法を持っていません。これを行うにはよりよい方法があると確信していますが、うまくいくようです。

.xpath('//')は、どこでもクエリに一致するアイテムを検索します。子要素が<instance>の場合は、branch.xpath('vipAddress/text()')のようにしてください。 target_portを見つけるのも同じです。 、これは素晴らしい仕事

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

感謝:

はまた、私は常にリストを返す.xpathだと思うので、このすべてが動作する場合でも、あなたのportは一緒に私のような何かを得る[9011]

がそれを置くようになります! – len