如何在Python中获取xml中元素的值

时间:2018-05-10 14:49:35

标签: python xml

<?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

谢谢。

1 个答案:

答案 0 :(得分:0)

xml文档中有很多节点。例如,

<book>
    <title>I Am The Very Model</title>
</book>

title不是childNodes[0]。那个是带有换行符的文本节点,以及<book><title>之间的空格。您需要在子节点中搜索title元素,最简单的方法是使用getElementsByTagName。获得正确的元素后,可能会有多个节点保存文本。您需要枚举所有这些以查找所需的文本。您还需要确定节点周围的空白区域可以被剥离,否则您可能会在输出中出现奇怪的间隙。

迁移到ElementTreelxml的一个原因是他们倾向于整理这个并为您提供更简单的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