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
¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top