Lecture d'étiquettes de fichier XML
-
26-10-2019 - |
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
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)