Supposons que nous ayons le fichier XML avec la structure comme suit.
import urllib, urllib2 from lxml import etree url = "https://dl.dropbox.com/u/540963/short_test.xml" fp = urllib2.urlopen(url) doc = etree.parse(fp) fp.close() ns = {'xsi':'http://www.loc.gov/zing/srw/'} for record in doc.xpath('//xsi:record', namespaces=ns): print record.xpath("xsi:recordData/record/datafield[@tag='000']", namespaces=ns)
Je me demande comment faire cela en utilisant LXML et XPath. Collé ci-dessous est mon code initial et je demande à quelqu'un de m'expliquer, comment analyser les valeurs. P>
<?xml version="1.0" ?> <searchRetrieveResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/zing/srw/ http://www.loc.gov/standards/sru/sru1-1archive/xml-files/srw-types.xsd" xmlns="http://www.loc.gov/zing/srw/"> <records xmlns:ns1="http://www.loc.gov/zing/srw/"> <record> <recordData> <record xmlns=""> <datafield tag="000"> <subfield code="a">123</subfield> <subfield code="b">456</subfield> </datafield> <datafield tag="001"> <subfield code="a">789</subfield> <subfield code="b">987</subfield> </datafield> </record> </recordData> </record> <record> <recordData> <record xmlns=""> <datafield tag="000"> <subfield code="a">123</subfield> <subfield code="b">456</subfield> </datafield> <datafield tag="001"> <subfield code="a">789</subfield> <subfield code="b">987</subfield> </datafield> </record> </recordData> </record> </records> </searchRetrieveResponse>
3 Réponses :
Essayez le code de travail suivant:
import urllib2 from lxml import etree url = "https://dl.dropbox.com/u/540963/short_test.xml" fp = urllib2.urlopen(url) doc = etree.parse(fp) fp.close() for record in doc.xpath('//datafield'): print record.xpath("./@tag")[0] for x in record.xpath("./subfield/text()"): print "\t", x
Je serais plus direct dans votre XPath: allez directement pour les éléments que vous souhaitez, dans ce cas datafield code>.
>>> for df in doc.xpath('//datafield'):
# Iterate over attributes of datafield
for attrib_name in df.attrib:
print '@' + attrib_name + '=' + df.attrib[attrib_name]
# subfield is a child of datafield, and iterate
subfields = df.getchildren()
for subfield in subfields:
print 'subfield=' + subfield.text
Oui, je n'ai qu'un espace de noms.
Je voudrais simplement aller avec Aussi, vous n'avez pas besoin d'Urllib, vous pouvez également analyser XML avec HTTP P> url = "http://dl.dropbox.com/u/540963/short_test.xml" #doesn't work with https though
doc = etree.parse(url)
Vous utilisez le préfixe
XSI code> pour l'espace de noms
http://www.loc.gov/zing/srw/ code> - ceci est valide, mais généralement
xsi Le code> est utilisé comme préfixe pour l'espace de noms standard
http://www.w3.org/2001/xmlschema-Instance code>.