Python lxml - 无法访问父

时间:2017-02-20 00:28:50

标签: python xpath lxml

我有一个我需要搜索的xml树:

<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但是当我尝试打印{{1时使用下面的代码它打印了所有这些而不是我实际需要的那个vipAddress

port

示例:

如果我要搜索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()') 而不是返回mastertarget_environment=vip.address.com,则会返回port=9011target_environment=[vip.address.com, vip2.address.com]

我确信我做的事情很简单我只是看不出来。

1 个答案:

答案 0 :(得分:1)

我在python中使用xml并不是最好的,但我确实看到了一些问题:

for record in tree.xpath('//branch/text()'):会将您的分支元素转换为字符串,您可以将其进一步用于与branch_name进行比较。字符串没有getparent()方法,因此您可能希望从xpath中删除text()并将branch_namerecord.text进行比较

一旦你的record是一个元素,在记录中调用getparent()两次将为你提供它的祖父母元素instance。我确信有更好的方法可以做到这一点,但它似乎有效。

.xpath('//')在任何地方搜索与查询匹配的项目。由于您只想要<instance>的孩子,branch.xpath('vipAddress/text()')应该这样做。同样可以找到target_port。

我认为.xpath总是返回一个列表,所以即使这一切都有效,port也会看起来像[9011]

把它放在一起我会得到类似的东西:

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)