<?xml version="1.0" encoding="utf-8"?>
<bookstore name="Libreria Pastor">
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>
<writer>Giada De Laurentiis</writer>
<resumer>Pepe Lopez</resumer>
</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>
<writer>J K. Rowling</writer>
<resumer>Ana Martinez</resumer>
</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="PROGRAMMING">
<title lang="en">Python for All</title>
<author>
<writer>M.L. Jobs</writer>
<resumer>Delton Jones</resumer>
</author>
<year>2015</year>
<price>39.99</price>
</book>
</bookstore>
from xml.dom import minidom
arbol_dom = minidom.parse('C:\\Users\\MiguelRG\\Desktop\\sge\\Pythons\\e3.xml')
listaBibliotecas = arbol_dom.getElementsByTagName("bookstore");
listaLibros = arbol_dom.getElementsByTagName("book");
listaAutores = arbol_dom.getElementsByTagName("author");
for biblioteca in listaBibliotecas:
print(biblioteca.tagName);
print("Nombre : " +biblioteca.getAttribute("name"));
print("Tiene hijos:"+str(biblioteca.hasChildNodes()));
for l in listaLibros:
print("Tipo: "+l.tagName);
print("Categoria: "+l.getAttribute("category"));
print("Titulo : " +l.childNodes[0].nodeValue);
print("Lenguaje : "+l.getAttribute("lang"));
for a in listaAutores:
**print("Escritor : " + str(a.childNodes[0].nodeValue));**
**print("Resumen por : "+str(a.childNodes[1].nodeValue));**
break;
我想用那个程序或类似东西读取xml,但是我无法获得标题内的信息以及价格和内容,我需要首先打印书店的信息,然后是每本书的信息,然后是作者的信息。
任何帮助都将是apreciated
谢谢。
答案 0 :(得分:0)
xml文档中有很多节点。例如,
<book>
<title>I Am The Very Model</title>
</book>
title
不是childNodes[0]
。那个是带有换行符的文本节点,以及<book>
和<title>
之间的空格。您需要在子节点中搜索title元素,最简单的方法是使用getElementsByTagName
。获得正确的元素后,可能会有多个节点保存文本。您需要枚举所有这些以查找所需的文本。您还需要确定节点周围的空白区域可以被剥离,否则您可能会在输出中出现奇怪的间隙。
迁移到ElementTree
或lxml
的一个原因是他们倾向于整理这个并为您提供更简单的API。
在致电getElementsByTagName
时,您还需要小心。当你完成listaAutores = arbol_dom.getElementsByTagName("author");
时,你得到了文档中的所有作者,当你真的只想要一本书的作者时。
顺便说一句,摆脱行尾的额外分号。它们是不必要的,驱动python程序员疯了!
另外,print
添加空格并将对象转换为字符串。只需使用其功能而不是字符串连接,以便您的代码具有一致的外观。
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