擅长:python、mysql、java
<p>下面介绍如何使用lxml实现这一点,而不必硬编码名称空间或扫描它们的文本(正如Martijn Pieters提到的那样):</p>
<pre><code>from lxml import etree
tree = etree.parse("filename")
root = tree.getroot()
root.findall('owl:Class', root.nsmap)
</code></pre>
<p><strong>更新</strong>:</p>
<p>5年后,我仍然在讨论这个问题的变化。正如我在上面所展示的,lxml是有帮助的,但不是每种情况下都有帮助。当涉及到合并文档时,注释者对于这种技术可能有一个有效的观点,但是我认为大多数人很难简单地搜索文档。</p>
<p>还有一个案子,我是怎么处理的:</p>
<pre><code><?xml version="1.0" ?><Tag1 xmlns="http://www.mynamespace.com/prefix">
<Tag2>content</Tag2></Tag1>
</code></pre>
<p>没有前缀的xmlns意味着未固定的标记将获得此默认命名空间。这意味着在搜索Tag2时,需要包含命名空间才能找到它。然而,lxml创建了一个没有作为键的nsmap条目,我找不到搜索它的方法。所以,我创建了一个新的名称空间字典</p>
<pre><code>namespaces = {}
# response uses a default namespace, and tags don't mention it
# create a new ns map using an identifier of our choice
for k,v in root.nsmap.iteritems():
if not k:
namespaces['myprefix'] = v
e = root.find('myprefix:Tag2', namespaces)
</code></pre>