<p>xml文档中有很多节点。例如,与</p>
<pre><code><book>
<title>I Am The Very Model</title>
</book>
</code></pre>
<p><code>title</code>不是<code>childNodes[0]</code>。这是一个文本节点,换行符和<code><book></code>和<code><title></code>之间的空格。您需要在子节点中搜索title元素,最简单的方法是使用<code>getElementsByTagName</code>。一旦获得正确的元素,可能会有多个节点保存文本。您需要枚举所有这些文本才能找到所需的文本。您还需要决定节点周围的哪些空白位可以被剥离,否则可能会导致输出中出现奇怪的间隙</p>
<p>迁移到<code>ElementTree</code>或<code>lxml</code>的一个原因是,它们倾向于整理这些内容,并为您提供一个更简单的API</p>
<p>您还需要注意调用<code>getElementsByTagName</code>的位置。当你做了<code>listaAutores = arbol_dom.getElementsByTagName("author");</code>你得到了文档中所有的作者,而你真的只是想要一本书的作者</p>
<p>作为旁白,去掉行末多余的分号。它们是不必要的,会让python程序员发疯</p>
<p>另一方面,<code>print</code>添加空格并将对象转换为字符串。只需使用它的功能,而不是字符串串联,这样您的代码就具有一致的外观和感觉</p>
<pre><code>from xml.dom import minidom
arbol_dom = minidom.parse('test.xml')
def get_elem_text(elem):
"""join text in all immediate child text nodes"""
return ''.join(node.data for node in elem.childNodes
if node.nodeType == node.TEXT_NODE)
for biblioteca in arbol_dom.getElementsByTagName("bookstore"):
print(biblioteca.tagName)
print("Nombre :", biblioteca.getAttribute("name"))
print("Tiene hijos:", biblioteca.hasChildNodes())
for l in biblioteca.getElementsByTagName("book"):
print("Tipo:", l.tagName)
print("Categoria:", l.getAttribute("category"))
print("Titulo :", get_elem_text(l.getElementsByTagName("title")[0]))
print("Lenguaje :", l.getAttribute("lang"))
for a in l.getElementsByTagName("author"):
print("Escritor :",
get_elem_text(a.getElementsByTagName("writer")[0]))
print("Resumen por :",
get_elem_text(a.getElementsByTagName("resumer")[0]))
break
</code></pre>