我有一个如下所示的XML文件:
xml = '''<?xml version="1.0"?>
<root>
<item>text</item>
<item2>more text</item2>
<targetroot>
<targetcontainer>
<target>text i want to get</target>
</targetcontainer>
<targetcontainer>
<target>text i want to get</target>
</targetcontainer>
</targetroot>
...more items
</root>
'''
使用lxml我试图访问元素中的文本&lt;目标&gt;。我找到了解决方案,但我确信有更好,更有效的方法来做到这一点。我的解决方案:
target = etree.XML(xml)
for x in target.getiterator('root'):
item1 = x.findtext('item')
for target in x.iterchildren('targetroot'):
for t in target.iterchildren('targetcontainer'):
targetText = t.findtext('target')
虽然这有效,但是因为它让我可以访问root中的所有元素以及目标元素,所以我很难相信这是最有效的解决方案。
所以我的问题是:是否有更有效的方式来访问&lt;保留在root循环中的目标&gt;&#39;文本,因为我还需要访问其他元素。
答案 0 :(得分:3)
您可以使用XPath:
for x in target.xpath('/root/targetroot/targetcontainer/target'):
print x.text
我们要求所有符合路径的元素。在这种情况下,路径为/root/targetroot/targetcontainer/target
,表示
位于
<target>
元素内的<targetcontainer>
元素内<targetroot>
元素内<root>
元素内的所有<root>
元素。此外,/
元素应该是文档根,因为它前面是<?xml version="1.0"?>
,这意味着文档的开头。
此外,您的XML文档有两个问题。首先,</xml>
声明应该是文档中的第一件事 - 在这个例子中,它前面有换行符和一些空格。此外,它不是标记,也不应该关闭,因此应删除字符串末尾的<target>
。无论如何,我已经编辑了你的问题。
编辑:此解决方案尚未得到改进。您不需要传递所有路径 - 您可以只询问文档中的所有元素<target>
。这是通过在标签名称前加两个斜杠来完成的。由于您需要所有 for x in target.xpath('//target'):
print x.text
文本,而不管它们在何处,这可能是更好的解决方案。因此,上面的循环可以写成:
{{1}}
我一开始尝试过,但没效果。然而,问题是XML中的语法问题,而不是XPath,但我尝试了另一个更长的路径而忘了重试这个问题。抱歉!无论如何,我希望我对XPath有所了解:))