<p><a href="http://xmlsoft.org/python.html" rel="noreferrer">libxml2</a>有许多优点:</p>
<ol>
<li>遵守<a href="http://www.w3.org/TR/xpath" rel="noreferrer">spec</a></li>
<li>积极发展和社区参与</li>
<li>速度。这实际上是一个围绕C实现的python包装器。</li>
<li>无处不在。libxml2库无处不在,因此经过了很好的测试。</li>
</ol>
<p>缺点包括:</p>
<ol>
<li>遵守<a href="http://www.w3.org/TR/xpath" rel="noreferrer">spec</a>。这很严格。在其他库中,像默认命名空间处理这样的操作更容易。</li>
<li>使用本机代码。这可能是一种痛苦,取决于您的应用程序是如何分布/部署的。RPMs可以减轻一些疼痛。</li>
<li>手动资源处理。注意下面的示例中对freeDoc()和xpathFreeContext()的调用。这不是很Python。</li>
</ol>
<p>如果您正在进行简单的路径选择,请使用<a href="http://effbot.org/zone/element-xpath.htm" rel="noreferrer">ElementTree</a>(包含在Python 2.5中)。如果您需要完全符合规范或原始速度,并且能够处理本机代码的分发,请使用libxml2。</p>
<p><strong>libxml2xpath使用示例</p>
<hr/>
<pre><code>import libxml2
doc = libxml2.parseFile("tst.xml")
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("//*")
if len(res) != 2:
print "xpath query: wrong node set size"
sys.exit(1)
if res[0].name != "doc" or res[1].name != "foo":
print "xpath query: wrong node set value"
sys.exit(1)
doc.freeDoc()
ctxt.xpathFreeContext()
</code></pre>
<p><strong>元素树XPath使用示例</strong></p>
<hr/>
<pre><code>from elementtree.ElementTree import ElementTree
mydoc = ElementTree(file='tst.xml')
for e in mydoc.findall('/foo/bar'):
print e.get('title').text</code></pre>
<hr/>