10
votes

Paysez XML avec LXML - Valeur d'élément d'extraction

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)
  • le contenu du "sous-champ" (par exemple 123 dans l'exemple ci-dessus) et li>
  • Valeurs d'attribut (par exemple. 000 ou 001) li> ul>

    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>
    


1 commentaires

Vous utilisez le préfixe XSI pour l'espace de noms http://www.loc.gov/zing/srw/ - ceci est valide, mais généralement xsi est utilisé comme préfixe pour l'espace de noms standard http://www.w3.org/2001/xmlschema-Instance .


3 Réponses :


6
votes

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


0 commentaires

17
votes

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


1 commentaires

Oui, je n'ai qu'un espace de noms.



6
votes

Je voudrais simplement aller avec xxx pré>

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)


0 commentaires