Question

Je veux lire les valeurs de variables comme <title>, <title_id> à partir du fichier xml. La valeur de <title> lu avec succès. Est-il possible de lire le <title>, <title_id> avec la même boucle
S'il vous plaît aidez-moi je suis nouveau au format 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>

J'utilise le code suivant pour lire tout le titre du fichier. Et son beau travail.

import xml.etree.cElementTree as etree
tree = etree.parse('find_title.xml')
for value in tree.getiterator(tag='title'):
    print value.text
Était-ce utile?

La solution

Si vous allez travailler avec XML beaucoup, je vous suggère de vous familiariser avec XPATH .

Voici un extrait rapide à l'aide de ma bibliothèque XML de préférence, 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))

Rendements:

Sex
31239628

Mise à jour - en supposant que plusieurs éléments de la page

requêtes XPath renvoient essentiellement des séquences de noeuds (d'où la fonction first).

Vous pouvez utiliser une seule requête qui retourne les valeurs des deux balises pour toutes les pages. Vous devrez alors les regrouper, si un sous-élément manquait dans une page que vous seriez hors de l'étape. Vous pouvez écrire la requête pour que les sous-éléments existaient, mais vous voudrez peut-être savoir qu'il y avait un enregistrement partiel, etc, etc.

Donc, ma première réponse à ce serait faire une boucle à travers les pages comme ceci:

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)

Cédant:

Page 0: Sex (31239628)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top