Mostrando entradas con la etiqueta XML. Mostrar todas las entradas
Mostrando entradas con la etiqueta XML. Mostrar todas las entradas

23 de mayo de 2016

60. PR17 Conversor de bases de datos

PR17: Convirtiendo bases de datos: de MySQL a XML y JSON

Usa la base de datos en MySQL del ejemplo para hacer lo siguiente:
  1. Lee los registros de los nombres y de la fecha de creación de la calle.
  2. Traspasa estos datos a dos ficheros: uno XML y otro JSON con estos datos.
  3. Guarda los ficheros.
  1. Programa realizado. 

58. Análisis de documentos XML en Python

Acceso al XML de ejemplo: catalogo.xml
  1. Tutorial DOM y XML (inglés).
  2. Para saber más.
  3. Datos abiertos Gobierno de España

Analizar contenido XML con DOM

Al escribir un programa en Python, usaremos el estándar DOM del W3C. Cargaremos el documento como un objeto, usando el módulo xml.dom y recuperando el objeto "minidom", que provee un acceso rápido al documento.
NOTA: tanto el fichero en Python como el fichero de ejemplo cd_catalogo.xml (descárgalo) deben estar en la misma carpeta.
#!/usr/bin/python
# coding: utf-8

from xml.dom.minidom import parse
import xml.dom.minidom

# Abre el documento XML usando el analizador (parser) minidom
DOMTree = xml.dom.minidom.parse("cd_catalogo.xml") #-> Modelo del Documento en forma de árbol
collection = DOMTree.documentElement # -> Objeto raíz
print "El nombre de la coleccion es: %s \n" % collection.localName

# Obtiene una lista de los objetos con la etiqueta CD
cds = collection.getElementsByTagName("CD")

# Muestra en pantalla cada detalle de cada CD
for cd in cds:    
   print "*****CD*****" 
   titulo = cd.getElementsByTagName('TITULO')[0]
   print "Título: %s" % titulo.childNodes[0].data.encode("utf-8")
   artista = cd.getElementsByTagName('ARTISTA')[0]
   print "artista: %s" % artista.childNodes[0].data.encode("utf-8")
   pais = cd.getElementsByTagName('PAIS')[0]
   print "País: %s" % pais.childNodes[0].data.encode("utf-8")
   comp = cd.getElementsByTagName('PAIS')[0]
   print "Compañía: %s" % comp.childNodes[0].data.encode("utf-8")
   precio = cd.getElementsByTagName('PRECIO')[0]
   print "Precio: %s €" % precio.childNodes[0].data.encode("utf-8")
   anno = cd.getElementsByTagName('ANNO')[0]
   print "Año: %s" % anno.childNodes[0].data.encode("utf-8")
   print "=" * 20 + "\n"
Todos los métodos del xml.dom pueden encontrarse en: https://docs.python.org/2.7/library/xml.dom.html
= = =

Abrir fichero XML y presentarlo en pantalla

Apertura del fichero XML y presentación en pantalla
#!/usr/bin/python
# coding: utf-8

from xml.dom.minidom import parse
import xml.dom.minidom

# Abre el documento XML usando el analizador (parser) minidom
modelo = xml.dom.minidom.parse("cd_catalogo.xml") #-> Modelo # #  del Documento en forma de árbol. Apertura por nombre
# O bien
# fichero = open("cd_catalogo.xml")
# modelo = parse(fichero) # Otra forma de abrir el fichero.

coleccion = modelo.documentElement # -> Objeto raíz
print "El nombre de la coleccion es: %s \n" % coleccion.localName

print coleccion.toxml()
# print coleccion.toprettyxml() # --> formas de presentar los daros como un bloque
 
= = = 
 

Crear un fichero XML y guardarlo

Crear un fichero XML
# coding: utf-8

from xml.dom import minidom

Ordenador1 = ['Pentium M', '512MB']
Ordenador2 = ['Pentium Core 2', '1024MB']
Ordenador3 = ['Pentium Core Duo', '1024MB']
listaOrdenadores = [Ordenador1, Ordenador2, Ordenador3]

# Abro un modelo DOM en modo implementar
DOMimpl = minidom.getDOMImplementation()

#Crear el documento econ la etiqueta principal estacionesTrabajo
xmldoc = DOMimpl.createDocument(None,"estacionesTrabajo", None)
doc_root = xmldoc.documentElement

# Recorro la lista de ordenadores
for ordenador in listaOrdenadores:
    
    #Crear Nodo... (*)
    nodo = xmldoc.createElement("Ordenador")

    # Crear un subnodo, llamado procesador
    elemento = xmldoc.createElement('Procesador')
    # Le añado un nodo de texto, y le asigno la posición 0 de la lista
    elemento.appendChild(xmldoc.createTextNode(ordenador[0]))
    # Añado el subnodo al nodo anterior
    nodo.appendChild(elemento)
    
    # Idéntico.
    elemento = xmldoc.createElement('Memoria')
    elemento.appendChild(xmldoc.createTextNode(ordenador[1]))
    nodo.appendChild(elemento)

    # (*)... que se añade como hijo al doc_root
    doc_root.appendChild(nodo)

# Recorrer para presentar en pantalla la lista de los nodos
listaNodos = doc_root.childNodes
for nodo in listaNodos:
    print nodo.toprettyxml()

# Guardar la información en un fichero de texto
fichero = open("ordenadores.xml", 'w')
# fichero.write(xmldoc.toxml())
# fichero.write(xmldoc.toprettyxml()) --> diferentes formas de guardar un fichero xml
fichero.write(xmldoc.toprettyxml(encoding="utf-8"))
fichero.close()
 
= = = 
 

Análisis de los elementos de la primera etiqueta en cd_catalogo.xml

# coding: utf-8

from xml.dom import minidom                                      

xmldoc = minidom.parse('cd_catalogo.xml')   
print xmldoc                                                               
grammarNode = xmldoc.firstChild
print grammarNode # CATALOGO

refNode = grammarNode.childNodes[1]     
print refNode #--> Nivel 1, etiqueta CD.
print refNode.childNodes  # --> Todo lo que hay bajo la etiqueta CD                         

pNode = refNode.childNodes[3]
print pNode #--> El elemento que está tercero. "ARTISTA"
print pNode.toxml()  # -> Impresión de dicho nodo.

print pNode.firstChild      #-> Texto que hay dentro de "ARTISTA", pero como objeto                         
print pNode.firstChild.data #-> Texto extraído del objeto anterior.
 
= = = 
 

Extraer texto y modificarlo

Extraigo texto del fichero de ejemplo cd_catalogo.xml y lo modifico. En particular a la primera entrada "Empire Burlesque", se le hace la modificación "Imperio Burlesco". En el ejemplo, los datos se escriben en un nuevo fichero cd_catalog2.xml
#!/usr/bin/python
# coding: utf-8

from xml.dom.minidom import parse
import xml.dom.minidom

# Abre el documento XML usando el analizador (parser) minidom
modelo = xml.dom.minidom.parse("cd_catalogo.xml") #-> Modelo # #  del Documento en forma de árbol. Apertura por nombre
# O bien
# fichero = open("cd_catalogo.xml")
# modelo = parse(fichero) # Otra forma de abrir el fichero.
# después al final habrá que cerrar el fichero. fichero.close()

coleccion = modelo.documentElement # -> Objeto raíz
print "El nombre de la coleccion es: %s \n" % coleccion.localName

cds = coleccion.getElementsByTagName("CD")

for cd in cds:    
    
    titulo = cd.getElementsByTagName("TITULO")
    # titulo es una lista de Nodos, aunque sólo sea uno. Lo siguiente print titulo.toxml() no funcionará
    # print titulo[0].toxml() Esto si funcionará
    # print titulo[0].childNodes # --> Esto es un objeto
    print titulo[0].childNodes[0].data #--> Accede a un dato de texto
    # print titulo[0].childNodes[0].data.encode("utf-8") #-> no está de más codificar en utf-8
    if titulo[0].childNodes[0].data.encode("utf-8") == "Empire Burlesque":
        print "detectado"
        titulo[0].childNodes[0].data = u'Imperio Burlesco' # --> Tiene que ser en formato UNICODE u''
        print titulo[0].childNodes[0].data #--> Accede a un dato de texto
    print "=" * 20    

fichero = open("cd_catalogo2.xml","w")
# fichero = open("cd_catalogo.xml","w") # --> Para sobrescribir en el mismo fichero.
fichero.write(coleccion.toxml(encoding='utf-8')) #--> Forzar la codificación a UTF-8
fichero.close()
# print coleccion.toprettyxml() # --> formas de presentar los daros como un bloque '''
 
= = =
 

Generar fichero XML con DOM

Generar fichero XML con DOM
# coding: utf-8

from xml.dom import minidom, Node

doc = minidom.Document() #--> Crear un documento xml

doc.appendChild(doc.createComment("Creando documento de ejemplo XML")) #-> Escribir comentario

book = doc.createElement('libro') # --> Crear elemento dentro del documento
doc.appendChild(book) #-> Añadirlo a la raíz del documento

title = doc.createElement('Título') # --> Crear elemento título
title.appendChild(doc.createTextNode('D. Quijote de La Mancha')) # --> Agrgar nodo de texto
book.appendChild(title) # --> Añadir dentro del elemento book

author = doc.createElement('Autor') # --> Crear elemento Autor
book.appendChild(author) # --> Añadir al elemento libro

name = doc.createElement('Nombre y Apellidos')  # --> Crear elemento Nombre y Apellidos
author.appendChild(name) # --> Añadir dentro de Autor

firstname = doc.createElement('Nombre') # --> Crear elemento Nombre
name.appendChild(firstname)
firstname.appendChild(doc.createTextNode('Miguel'))
name.appendChild(doc.createTextNode('Texto añadido aquí'))
lastname = doc.createElement('Apellidos') # --> Crear elemento  Apellidos
name.appendChild(lastname)
lastname.appendChild(doc.createTextNode('De Cervantes Saavedra'))

chapter = doc.createElement('Capítulo')
book.appendChild(chapter)
chapter.setAttribute('number', '1')
title = doc.createElement('title')
chapter.appendChild(title)
title.appendChild(doc.createTextNode('Capítulo Primero'))

print doc.toprettyxml(indent =' ')

= =  =

Presentar documento XML en forma de árbol

Presentar documento XML en forma de árbol
# coding: utf-8

from xml.dom import minidom, Node

def scanNode(node, level = 0):
    msg = node.__class__.__name__
    texto=""
    if node.nodeType == Node.ELEMENT_NODE:
        msg += ", tag: " + node.tagName
    elif node.nodeType == Node.TEXT_NODE:
        texto = ": "+node.data
    print " " * level * 4, msg, texto
    if node.hasChildNodes:
        for child in node.childNodes:
            scanNode(child, level + 1)
            
doc = minidom.parse('cd_catalogo.xml') 
scanNode(doc)
 
= = =  
 

 
 

57. Ficheros XML con Python.

Introducción a XML

Para saber más: http://www.w3schools.com/xml/default.asp

¿Qué es XML?

XML es una herramienta de software (y hardware) para guardar y transportar datos. Hoy en día, por su difusión en muchos sistemas, es importante conocerla para cualquier desarrollador de software. Es recomendable saber algo de HTML y Javascript antes de aprender a usar XML.
XML significa Lenguaje de Marcado Extensible (EXtensible Markup Language). Es un lenguaje de marcado como HTML. Recomienda su uso el W3C y se diseñó tanto para que las máquinas como las personas pudieran entender fácilmente la información que contienen.
Imagina que Antonio quiera enviar una nota a Maricarmen. La nota podría ser así:
Para: Maricarmen
De: Antonio
Asunto: Recordatorio
Cuerpo: ¡Oye! ¡Te recuerdo que tienes dentista el Jueves a las seis y media!
Esta información, formateada de la siguiente forma, sigue un estándar XML, que no es más que darle un formato, empaquetarla y etiquetarla. Un fichero XML no son instrucciones, no hace nada, simplemente es información.
<nota>
   <para>Maricarmen</para>
   <de>Antonio</de>
   <asunto>Recordatorio</asunto>
   <cuerpo>¡Oye! ¡Te recuerdo que tienes dentista el Jueves a las seis y media!</cuerpo>
 </nota>

Diferencias con HTML

Uno de los primeros lenguajes de marcado desarrollados, básico todavía hoy en día para el diseño de páginas web, es el HTML (Lenguaje de marcado de hipertexto). ¿Qué diferencias hay entre este lenguaje y XML?
  1. HTML trabaja con etiquetas predefinidas (<a>,<b>,<h1>,<table>,etc.) y XML no tiene etiquetado predefinido. En XML hay que definir las etiquetas y su estructura.
  2. HTML se centra en el desarrollo de páginas web, sobre todo en el contenido y su apariencia.
  3. XML se centra en el almacenamiento y transporte de datos.

XML es extensible

Un mismo documento XML puede extenderse en información por la adición de nuevas etiquetas. por ejemplo, en la nota anterior podría añadirse la etiqueta <día></día> y <hora></hora>. Programas antiguos que se desarrollaron para la versión antigua podrían seguir leyendo la información nueva simplemente ignorando las nuevas etiquetas.

XML simplifica las cosas

XML simplifica el almacenamiento de datos, su transporte, el cambio de plataformas (Windows, Linux, Macs) y la disponibilidad de los datos. Supone usar una forma común de comunicar datos entre los programas, evitando la conversión entre formatos. Facilita mucho que nuevos sistemas operativos (o nuevas versiones), nuevos programas o nuevas aplicaciones web puedan manejar los datos almacenados previamente, y no sólo ordenadores, sino incluso lo entienden las personas directamente o máquinas de lectura para ciegos, dispositivos móviles, etc.
 

XML tiene forma de árbol

Todos los documentos XML tienen una estructura de árbol. Empiezan con una etiqueta que es el "tronco" , a la que se le añaden subetiquetas, formándose "ramas", que acabn en las últimas etiquetas que serían como las "hojas".
En el siguiente ejemplo puedo definir los libros que hay en una biblioteca:
DOM node tree
  • os datos se empiezan a estructurar con una etiqueta principal, o elemento raíz (root). En nuestro ejemplo bookstore.
  • Dentro del bookstore, defino una etiqueta derivada (hija o child), llamada book. La etiqueta de la que proviene otra, se denominada etiqueta padre (parent), así que bookstore, además de ser la etiqueta raíz, es la etiqueta padre de book.
  • En este ejemplo, además, la etiqueta book tiene 4 hijos (child) que son las etiquetas title, author, year, price. Como las cuatro son hijos del mismo padre, se dice que son siblings (la palabra siblings en inglés significa hermanos o hermanas).
  • Cada etiqueta puede tener modificadores o atributos. Por ejemplo, un libro book puede pertenecer a la categoría cocina y otro a la categoría aventura. Por tanto, category es un atributo de book. Y, puede, o no, contener texto, información.
  • Además, suelen empezar con una línea donde se especifica la versión de xml usada y la codificación de los caracteres.
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
   <book category="cooking">
     <title lang="en">Everyday Italian</title>
     <author>Giada De Laurentiis</author>
     <year>2005</year>
     <price>30.00</price>
   </book>
   <book category="children">
     <title lang="en">Harry Potter</title>
     <author>J K. Rowling</author>
     <year>2005</year>
     <price>29.99</price>
   </book>
   <book category="web">
     <title lang="en">Learning XML</title>
     <author>Erik T. Ray</author>
     <year>2003</year>
     <price>39.95</price>
   </book>
 </bookstore>
 

Reglas sintácticas de XML

Las reglas que se usan en XML son sencillas, pero hay que recordarlas y seguirlas a rajatabla.
  1. Todos los documentos XML tienen que tener una etiqueta root que será el padre del resto de los elementos.
  2. El prólogo (<?xml version="1.0" encoding="UTF-8"?>) es opcional, pero si se inserta, se escribe al principio del todo. Aunque la codificación puede cambiar, es habitual guardar los documentos XML en UTF-8 y especificar dicha codificación en el prólogo. Además, UTF-8 es la codificación usada por defecto en HTML5, CSS, JavaScript, PHP, and SQL (lenguajes usados en la web).
  3. En HTML, aunque no se recomienda, las etiquetas sin cerrar pueden funcionar <p>Esto es un párrafo... Pero en XML hay que cerrar una etiqueta abierta. La única excepción es la etiqueta prólogo (que, en el fondo, no pertenece a la estructura de datos del documento).
  4. XML es "case sensitive", es decir, que las minúsculas y mayúsculas importan. Así las etiquetas <Coche> y <coche> son distintas. Entonces...
    • <Coche>Audi A8</coche> está mal.
    • <Coche>Peugeot 308</Coche> está bien.
  5. Todos los elementos tienen que estar bien anidados. Primero hay que cerrar los hijos, y después los padres.
    • <receta><ingrediente>Manzanas</ingrediente></receta> estaría bien.
    • <receta><ingrediente>Manzanas</receta></ingrediente> estaría mal.
  6. Los atributos deben estar entrecomillados
    • <book category=cocina> estaría mal
    • <book category="cocina"> estaría bien.
  7. Caracteres especiales. Por ejemplo, si quisiera escribir como un dato: el partido entre el Betis y el Sevilla quedó <0-0> tendría un problema. Los caracteres "<" y ">" están reservados en XML para abrir y cerrar etiquetas, así que la información <0-0> produciría un error. Tengo dos opciones: o evitar esos caracteres, o usar su codificación de entidad (entity references). En XML se usan 5, que son:  &lt; < , &gt; >, &amp;  &, &apos; ' ,&quot;  " , referidas al "menor que", "mayor que", "símbolo Y", "apóstrofe" y "comillas dobles".
    • En el ejemplo, debería escribir : el partido entre el Betis y el Sevilla quedó  &lt; 0-0 &gt;
  8. Comentarios, como en HTML, <!-- Este es un comentario -->
  9. Los espacios en blanco entre palabras se conservan (en HTML no):  Hola          caracola
  10. El código de final de línea es LF (salto de línea), exactamente igual que en los sistemas Linux.
  11. Se dice que el fichero XML está bien formateado "Well-formed" y no presenta errores cuando cumple todas estas reglas.

Tipos de elementos XML, Atributos y Namespaces

XML Elementos

  • Un elemento es todo aquello contenido entre dos etiquetas <precio>32€</precio>
  • Un elemento puede contener: textos, atributos, u otro elementos; o una mezcla de todo ello.
  • Pueden existir elementos vacíos (que no contengan nada) como: <elemento></elemento>. También pueden escribirse como <elemento />
  • Los elementos son sensibles a las mayúsculas y minúsculas, deben empezar por una letra o un subrayado bajo (_), una etiqueta no puede empezar con las letras "Xml" ó "xml", y no deben contener espacios. Evita, para no tener mala interpretaciones con algún software, los caracteres ".","-",":" y las letras con acento o la ñ.
  • Recuerda, que los elementos son extensibles. Pueden añadirse más elementos hijos.
= = =

XML Atributos

  • Son informaciones relativas a un elemento, como por ejemplo <persona genero="femenino">. También es posible usar las comillas simples <persona genero='femenino'>
  • Ejemplo si tengo un atributo cuyo valor contiene los caracteres comillas dobles en su interior: <gangster name='George "Shotgun" Ziegler'> De separador se usa la comilla simple; o si es necesario, al revés: <gangster name="George 'Shotgun' Ziegler", y en todo caso se puede usar las referencias a entidades &lt;  &gt;  &amp; &apos;  &quot;
  • Ejemplo de poner la misma información de tres formas (las tres son equivalentes):
<note date="2008-01-10">
  <to>Tove</to>
  <from>Jani</from>
</note>
<note>
  <date>2008-01-10</date>
  <to>Tove</to>
  <from>Jani</from>
</note>
<note>
  <date>
    <year>2008</year>
    <month>01</month>
    <day>10</day>
  </date>
  <to>Tove</to>
  <from>Jani</from>
</note>
  • No conviene abusar de los atributos. No poner demasiados, ya que no son expandibles, mo pueden contener datos múltiples y no tienen estructura de árbol. Es mejor incluir más etiquetas. Por tanto, evitar cosas como:
<note day="10" month="01" year="2008"
 to="Tove" from="Jani" heading="Reminder"
 body="Don't forget me this weekend!">
 </note>
  • Es buena idea usar "metadatos" (datos de los datos). Por ejemplo, una identificación (o id), para localizar rápidamente los datos. En este caso sí deberían ser atributos.
<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>
= = =

XML Namespaces

  • A veces, usando XML puedo entrar en conflictos. Por ejemplo, el primer trozo de información se refiere a una tabla de datos HTML (filas y columnas) y el segundo a una mesa (table en inglés).
<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>
<table>
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table>
  • Si uso en el mismo fichero XML ambas informaciones, puedo entrar en un conflicto, ya que el elemento <table> tiene hijos distintos. Para evitar el conflicto, puedo usar un prefijo. Por ejemplo, uso el prefijo h y f en el ejemplo siguiente; así puedo usar la información sobre mesas y tablas HTML.
<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table> 
  • Ahora viene lo importante: cuando uso prefijos en XML debo usar Namespaces (espacios con nombre). Se definen mediante un URI (Uniform Resource Identifier - Identificador uniforme de recurso) con el atributo xmlns, usando la nomenclatura xmlns:prefix="URI". Mejor verlo con un ejemplo (la segunda forma también es válida):
<root>

<h:table xmlns:h="http://www.w3.org/TR/html4/">
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table xmlns:f="http://www.w3schools.com/furniture">
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

</root> 
<root 
xmlns:h="http://www.w3.org/TR/html4/"
 xmlns:f="http://www.w3schools.com/furniture">

 <h:table>
   <h:tr>
     <h:td>Apples</h:td>
     <h:td>Bananas</h:td>
   </h:tr>
 </h:table>

 <f:table>
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
 </f:table>

 </root>
  • Cuando asigno atributos xmlns, adjudico nombres restringidos a los prefijos. El propósito del URI del Namespace no es servir para buscar información; simplemente para asegurarnos de que el namespace es único. Pero a veces se aprovecha el URI para apuntar a una web que muestra información adicional.
= = =

Namespaces por defecto (Default Namespaces)

  • También se puede usar un xmlns por defecto, y no usar prefijos.
<table xmlns="http://www.w3.org/TR/html4/">
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

<table xmlns="http://www.w3schools.com/furniture">
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table> 
 

Otros aspectos de los ficheros XML

  • Los navegadores suelen mostrar la información de los ficheros XLM en forma de árbol, con signos de menos (-) o (más) para expandir los nodos.
XML
  • XML puede formatearse con ficheros CSS (hojas de estilo en cascada, aunque en la web suelen leerse desde Javascript).
  • Los ficheros XML erróneos darán lugar a salidas parcialmente incorrectas o a mensajes de error.
  • Se usa el lenguaje de transformación XSLT para transformar un fichero XML en uno HTML para mostrar los datos en la WEB. (http://www.w3schools.com/xsl/default.asp)
  • Y se suele usar con el lenguaje XPath para encontrar información en un fichero XML (http://www.w3schools.com/xsl/xpath_intro.asp)
  • Hay otras aplicaciones como XLink, XPointer, para el uso de hipertexto. Se usa XML DTD o XML Schema para validar los datos, confrontarlos con una plantilla de datos y asegurarse de que se ajustan a ellas.
  • Los ficheros XML se pueden generar con PHP o ASP (¡o con Pyhton) directamente desde una aplicación o un servidor.
  • XML DOM (http://www.w3schools.com/xml/dom_intro.asp) es una forma estandarizada de añadir, borrar, obtener o cambiar elementos de un objeto XML. En él se define los objetos, métodos y propiedades de todos los elementos XML. Es una interfaz independiente de la plataforma y del lenguaje de programación.