2017-06-29 59 views
0

蟒蛇的XPath获取价值的同时,其并行的子值匹配

<multi-routing-engine-item> 

     <re-name>n</re-name> 

     <zones-information xmlns="http://xml48/juzones" j:s="de"> 
      <zones-security> 
       <zones-security-zonename>HH</zones-security-zonename> 
       <zones-security-interfaces> 
        <zones-security-interface-name>2.66</zones-security-interface-name> 
        <zones-security-interface-name>2.68</zones-security-interface-name> 
       </zones-security-interfaces> 
      </zones-security> 
      <zones-security>   
       <zones-security-zonename>BB</zones-security-zonename> 

我想HH(区,安全区域名)时区的安全-interface-name等于2.66

TREID很多方法。没有运气,使其工作

这是我的尝试:

multi-routing-engine-item/zones-information/zones-security[zones-security-interfaces/zones-security-interface-name='2.66']/zones-security-zonename 

请帮助

回答

1

尝试的XPath:

//zones-security-interface-name[.='2.66']/preceding::zones-security-zonename/text()

+0

不好主意直接使用'parent :: *'(实际上是'/../'),因为在元素将嵌套在另一个层内 - 路径将不起作用。在这种情况下,最好使用'preceding :: zones-security-interfaces' –

+0

修复它。感谢您的评论! – SomeDude

+0

干得好,我会投票给你的路径,虽然它有一个问题。如果'zones-security-zonename'在找到'zones-security'时会丢失,路径将查找以前的元素。所以如果你100%肯定元素会在里面 - 这个路径是好的。在其他情况下 - 最好找到需要文本并在其中搜索'zones-security-zonename'的'zones-security',以确保找到正确的元素) –

1

要获得元素:

//zones-security[.//zones-security-interface-name[text()='2.66']]/zones-security-zonename 

要获取文本:

到底

逻辑很简单添加/text(): 搜索zones-security包含zones-security-interface-name[text()='2.66']。并在找到的区域 - 得到/zones-security-zonename

+0

遵循您的指示,并且它可以工作:>>> response_zone.xpath(“// zones-security [.///zones-security-interface-name [text()='2.66']]/zones-security-zonename/text()“) ['HH']。 – Robbie

+0

好)标记答案是正确的,如果它的工作),或更正您的问题与正确的答案,以帮助其他 –

+0

标记。但为什么response_zone.findtext(“multi-routing-engine-item/zones-information/zones-security [.// zones-security-interface-name [text()='2.66']]/zones-security-zonename” )不起作用? – Robbie