我有一个我需要搜索的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>
我正在尝试通过分支中的文本进行搜索,然后获取祖父母元素并获取vipAddress
和port
但是当我尝试打印{{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()')
而不是返回master
和target_environment=vip.address.com
,则会返回port=9011
和target_environment=[vip.address.com, vip2.address.com]
我确信我做的事情很简单我只是看不出来。
答案 0 :(得分:1)
我在python中使用xml并不是最好的,但我确实看到了一些问题:
for record in tree.xpath('//branch/text()'):
会将您的分支元素转换为字符串,您可以将其进一步用于与branch_name
进行比较。字符串没有getparent()
方法,因此您可能希望从xpath中删除text()
并将branch_name
与record.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)