--- title: M06 Accés a dades. 003. XML DOM. tags: DAM, Java, M6 --- <div style="width: 30%; margin-left: auto;"> ![](https://hackmd.io/_uploads/HJiR4eGJT.png) </div> <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Llicència de Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />Aquesta obra està subjecta a una llicència de <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Reconeixement-CompartirIgual 4.0 Internacional de Creative Commons</a> [Link en MarkDown](https://hackmd.io/@JdaXaviQ/r1vIJGz8o) # M06 Accés a dades. UF01. ## [XML DOM](https://dom.spec.whatwg.org/). <div style="width: 45%;"> ![](https://i.imgur.com/KQh21Lm.png) ![](https://hackmd.io/_uploads/ryjNHRmfT.jpg) </div> Segons la [viquipèdia](https://ca.wikipedia.org/wiki/Model_d%27Objectes_del_Document): > El Model d'Objectes de Document (o també Model d'Objectificació de Document,[1] DOM en anglès i emprat ací com a referència acrònima) és una Interfície de Programació d'Aplicacions (API) per a documents HTML i XML, una convenció multiplataforma i independent del llenguatge de programació que serveix per a representar documents HTML, XHTML i XML i interaccionar-hi a través d'objectes. Proporciona una representació de l'estructura del document, la qual cosa permet al programador de modificar-ne el contingut i la presentació visual. En essència, comunica pàgines web amb guions (scripts) o llenguatges de programació. La historia del Model d'Objectes de Document està estretament relacionada amb la història de la “Guerra de navegadors” de finals dels anys 1990 entre el Netscape Navigator i Microsoft Internet Explorer, i també amb la de JavaScript i JScript. > Totes les propietats, mètodes i esdeveniments disponibles per a la manipulació i creació de pàgines web estan organitzats en objectes (per exemple, l'objecte de document que representa el document en si, l'objecte de taula que representa un element de taula HTML, i així successivament). En la majoria dels últims navegadors web aquests objectes són accessibles a través de llenguatges de script. El DOM s'utilitza molt sovint en combinació amb JavaScript. No obstant això, com ja s'ha indicat, el DOM va ser dissenyat per ser independent de qualsevol llenguatge de programació en particular, a fi de proporcionar una representació estructural del document a partir d'una API única i consistent. Les implementacions del DOM, doncs, es poden fer per a qualsevol llenguatge de programació. ## La biblioteca [xml.minidom](https://docs.python.org/3/library/xml.dom.minidom.html) En aquest curs utilitzarem la bibioteca xml.minidom per accedir a llegir o modificar fitxers xml. > [xml.dom.minidom](https://docs.python.org/es/3/library/xml.dom.minidom.html) es una implementación mínima de la interfaz Document Object Model (Modelo de objetos del documento), con una API similar a la de otros lenguajes. Está destinada a ser más simple que una implementación completa del DOM y también significativamente más pequeña. Aquellos usuarios que aún no dominen el DOM deberían considerar usar el módulo xml.etree.ElementTree en su lugar para su procesamiento XML. Normalment es comença per realitzar el 'parse' de l'XML. Per fer-ho tenim 3 possibilitats: ```py= from xml.dom.minidom import parse, parseString dom1 = parse('c:\\temp\\mydata.xml') # parse an XML file by name datasource = open('c:\\temp\\mydata.xml') dom2 = parse(datasource) # parse an open file dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>') ``` ```python= import xml.dom.minidom document = """\ <slideshow> <title>Demo slideshow</title> <slide><title>Slide title</title> <point>This is a demo</point> <point>Of a program for processing slides</point> </slide> <slide><title>Another demo slide</title> <point>It is important</point> <point>To have more than</point> <point>one slide</point> </slide> </slideshow> """ dom = xml.dom.minidom.parseString(document) def getText(nodelist): rc = [] for node in nodelist: if node.nodeType == node.TEXT_NODE: rc.append(node.data) return ''.join(rc) def handleSlideshow(slideshow): print("<html>") handleSlideshowTitle(slideshow.getElementsByTagName("title")[0]) slides = slideshow.getElementsByTagName("slide") handleToc(slides) handleSlides(slides) print("</html>") def handleSlides(slides): for slide in slides: handleSlide(slide) def handleSlide(slide): handleSlideTitle(slide.getElementsByTagName("title")[0]) handlePoints(slide.getElementsByTagName("point")) def handleSlideshowTitle(title): print(f"<title>{getText(title.childNodes)}</title>") def handleSlideTitle(title): print(f"<h2>{getText(title.childNodes)}</h2>") def handlePoints(points): print("<ul>") for point in points: handlePoint(point) print("</ul>") def handlePoint(point): print(f"<li>{getText(point.childNodes)}</li>") def handleToc(slides): for slide in slides: title = slide.getElementsByTagName("title")[0] print(f"<p>{getText(title.childNodes)}</p>") handleSlideshow(dom) ``` Exemple de com llegir el text d'un atribut, reaprofitant la funció getText de l'exemple anterior: ```pytho= id = getText(pelicula._attrs["id"].childNodes) ``` ### Alguns selectors útils. * un_node.getElementsByTagName("nom_etiqueta"): retorna una llista amb tots els elements que coincideixen amb el nom d'etiqueta donat. * un_node.childNodes: Aquesta propietat és una llista amb els nodes fills del node actual. * un_node.hasAttribute(nom_atribut): retorn un valor booleà indicant si existeix o no un atribut amb l'identificador donat.