Lectura de etiquetas de archivo XML
-
26-10-2019 - |
Pregunta
Quiero leer los valores de la etiqueta como <title>
,<title_id>
desde el archivo XML. El valor de <title>
Leer con éxito. ¿Es posible leer el <title>
,<title_id>
con el mismo bucle?
Por favor, ayúdame, soy nuevo en XML.
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en">
<siteinfo>
<sitename>Wiki</sitename>
<case>first-letter</case>
<namespaces>
<namespace key="0" case="first-letter" />
</namespaces>
</siteinfo>
<page>
<title>Sex</title>
<title_id>31239628</title_id>
<revision>
<id>437708703</id>
<timestamp>2011-07-04T13:53:52Z</timestamp>
<text xml:space="preserve" bytes="6830">{{ Hello}}
</text>
</revision>
</page>
</mediawiki>
Estoy usando el siguiente código para leer todo el título del archivo. Y está funcionando bien.
import xml.etree.cElementTree as etree
tree = etree.parse('find_title.xml')
for value in tree.getiterator(tag='title'):
print value.text
Solución
Si vas a trabajar mucho con XML, te sugiero que te familiarices con Xpath.
Aquí hay un fragmento rápido usando mi biblioteca de preferencia XML, lxml
.
from lxml import etree
doc = etree.XML("""
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en">
<siteinfo>
<sitename>Wiki</sitename>
<case>first-letter</case>
<namespaces>
<namespace key="0" case="first-letter" />
</namespaces>
</siteinfo>
<page>
<title>Sex</title>
<title_id>31239628</title_id>
<revision>
<id>437708703</id>
<timestamp>2011-07-04T13:53:52Z</timestamp>
<text xml:space="preserve" bytes="6830">{{ Hello}}
</text>
</revision>
</page>
</mediawiki>
""")
def first(seq,default=None):
for item in seq:
return item
return default
NSMAP=dict(mw="http://www.mediawiki.org/xml/export-0.5/")
print first(doc.xpath('/mw:mediawiki/mw:page/mw:title/text()',namespaces=NSMAP))
print first(doc.xpath('/mw:mediawiki/mw:page/mw:title_id/text()',namespaces=NSMAP))
Rendimientos:
Sex 31239628
Actualizar - Suponiendo múltiples elementos de página
Las consultas XPath son principalmente secuencias de nodo (de ahí la first
función).
Puede usar una sola consulta que devolviera los valores de ambas etiquetas para todas las páginas. Luego tendría que agruparlos, si faltara un subelemento en una página, estaría fuera de paso. Puede escribir la consulta para garantizar que existieran los subelementos, pero es posible que desee saber que había un registro parcial, etc., etc.
Entonces, mi primera respuesta a esto sería recorrer las páginas como así:
for i,page in enumerate(doc.xpath('/mw:mediawiki/mw:page',namespaces=NSMAP)):
title = first(page.xpath('./mw:title/text()',namespaces=NSMAP))
title_id = first(page.xpath('./mw:title_id/text()',namespaces=NSMAP))
print "Page %s: %s (%s)" % (i,title,title_id)
Flexible:
Page 0: Sex (31239628)