<p>您的给定XML源包含一些错误;我修复了这些错误,请参阅下面的源代码:</p>
<pre><code>from lxml import etree
source = """
<root>
<scene name="scene1">
<view ath="0" atv="10" />
<image url="img1.jgp" />
<hotspot name="hot1" />
</scene>
<scene name="scene2">
<view ath="20" atv="10" />
<image url="img2.jgp" />
<hotspot name="hot2" />
</scene>
</root>
"""
</code></pre>
<p>要解析此源,您将创建一个etree:</p>
^{pr2}$
<p>(对于来自文件的源,请改用<code>etree.parse()</code>。)</p>
<p>现在,您可以通过正确访问<code>tree</code>来浏览已解析的XML。我最喜欢的方法是使用xpath导航(掌握这些超出了您的问题范围):</p>
<pre><code>allViews = tree.xpath('//root/scene/view')
for view in allViews:
print view.attrib
</code></pre>
<p>这将打印XPath找到的每个视图标记的所有XML属性:</p>
<pre><code>{'atv': '10', 'ath': '0'}
{'atv': '10', 'ath': '20'}
</code></pre>
<p>当然,您也可以访问视图元素的其他属性,比如它们的嵌入文本(这里当然是空的)或它们的子元素(子元素)(当然,在您的示例中它们也没有子元素)。在</p>
<p>您的问题的措辞表明您可能没有建立起这样一个事实的理解,即这个<code>view</code>对象确实是“整个视图标记”。您可以向<code>view</code>对象请求它所组成的标记(<code>view</code>)、属性(见上文)、内容(<code>view.text</code>)甚至子元素(<code>view.getchildren()</code>,但没有)。在</p>
<p>您可以通过调用<code>etree.tostring(view)</code>将已解析的XML结构转换回ASCII表示;这将返回一个类似<code>'<view ath="20" atv="10"/>\n '</code>的字符串。在大多数情况下,你不会这样做。在</p>
<p>您还可以访问元素查看元素的子元素:</p>
<pre><code>print tree.getchildren()[1].getchildren()[0].attrib
</code></pre>
<p>这将打印<code>tree</code>元素的第一个子元素(a<code>view</code>)的第0个子元素(a<code>view</code>)的XML属性:</p>
<pre><code>{'atv': '10', 'ath': '20'}
</code></pre>