2012-08-14 80 views
1

与几个人在这里#1的帮助下,我想出了下面的代码:在蟒蛇:使用XPath与元素从列表

import lxml.etree 

f = open("PaVE.tre.xml", "r") 
out = open("PaVE.2.xml", "a") 
data = f.read() 
line=["HPV16","Alpha"] 

tree = lxml.etree.XML(data) 
nsmap = {'phylo': 'http://www.phyloxml.org'} 
matches = tree.xpath('//phylo:name[text()="HPV16"]', namespaces=nsmap) 

for e in matches: 
    #do something fun 

不过,我硬编码HPV16到的XPath表达。我想从[0]行取HPV16。我在想这样的事:

matches = tree.xpath('//phylo:name[text()='+line[0]+']', namespaces=nsmap) 

但是,这似乎并没有工作! 一如往常,任何帮助,将不胜感激

编辑: 我加了一对夫妇从XML文件中的行为请求:

<phyloxml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.phyloxml.org" xsi:schemaLocation="http://www.phyloxml.org http://www.phyloxml.org/1.10/phyloxml.xsd"> 
<phylogeny rooted="true"> 
    <clade> 
    <clade> 
     <branch_length>0.5</branch_length> 
     <clade> 
     <name>HPV16</name> 
     <branch_length>1.0</branch_length> 
     </clade> 
     <clade> 
+0

我们可以得到的一个例子XML? – Petriborg 2012-08-14 23:54:46

+1

你错过了'line [0]'...'text()=“'+ line [0] +'”]' – mVChr 2012-08-14 23:55:49

+1

“的双引号,这似乎不起作用” - 发生了什么?例外?错误的输出?等等,'line [0]'的内容是什么? (p.s.你没有忘记它周围的双引号?) – mgibsonbr 2012-08-14 23:56:07

回答

3

你忘了你的XPath表达式引号:

>>> '//phylo:name[text()='+line[0]+']' 
'//phylo:name[text()=something]' 

我会做这个:

>>> '//phylo:name[text()="%s"]' % line[0] 
'//phylo:name[text()="something"]' 
+0

你可以在谓词中调用“text()”吗?我认为这是一个像任何其他标签一样的节点。可能是我记得它错了,自从我使用xpath以来已经有一段时间了。 – Petriborg 2012-08-14 23:59:26

+0

谢谢你们,我觉得很蠢!我应该看到那些引号! – Stylize 2012-08-15 00:02:02

+0

@Petriborg是的,你可以 – jterrace 2012-08-15 00:02:47