2010-06-27 6 views
2

J'essaie de trouver une fonction xml-interpréter (comme le simplexml_load_string) en Python, mais sans succès:/simplexml_load_string équivalent Python/Django

Disons que j'ai xml dans une chaîne

my_xml_string = """ 
<root> 
     <content> 
     <one>A value</one> 
     <two>Here goes for ...</two> 
     </content> 
</root>""" 

Pour lire une valeur en php je normaly quelque chose comme ça

// read into object 
$xml = simplexml_load_string(my_xml_string); 

// print some values 
echo $xml->root->content->one 
echo $xml->root->content->two 

sont là un objet équivalent en python/django?

Merci

Répondre

0

de xml.dom.minidom import *

my_xml_string = """ 
<root> 
     <content> 
     <one>A value</one> 
     <two>Here goes for ...</two> 
     </content> 
</root>""" 

xml = parseString(xml_string) 
result = xml.getElementsByTagName('one')[0].firstChild.data 

Cela fait l'affaire, pour l'instant!

4

Le plus proche est probablement ElementTree qui fait partie de la bibliothèque standard de Python (ou une version étendue lxml)

import xml.etree 

element = xml.etree.ElementTree.XML(my_xml_string) 

met en place l'élément qui est de la classe Element et cela peut être considéré comme listes d'éléments XML

# for your example 
print(element[0][0].tag) 
print(element[0][0].text) 
print(element[0][3].text) 

Vous pouvez également effectuer une recherche par XPaths si vous souhaitez utiliser des noms. Lxml possède également un modèle objectify qui permet l'accès aux éléments comme "si vous traitez une hiérarchie d'objets Python normale". Qui correspond le plus exactement à l'utilisation de php

+0

Hmm Qu'en est-xml.dom.minidom? –

+0

Vous pouvez utiliser cela - mais vous manipulez alors un DOM - lxml et Element Tree essaye de rendre le navifaction plus 'pythonic' que DOM pas spécifique – Mark

1

Le Python standard library inclut plusieurs modules d'analyse XML. Probablement le plus simple est ElementTree.

from xml.etree import cElementTree as ET 
xml = ET.fromstring(my_xml_string) 

print xml.find('.//content/one').text 
print xml.find('.//content/two').text 
1

ElementTree est assez fréquent et est probablement la meilleure bibliothèque inclus dans Python (depuis la version 2.5).

Cependant, personnellement, je préfère lxml à la fois pour la puissance et la flexibilité. La méthode "lxml.objectify" est particulièrement utile pour analyser de grands DOM XML dans des objets pythonic.

+0

Je n'aime pas vraiment le ElementTree, peut-être que je suis un peu inutilisé à la syntaxe. xml.dom.minidom me semble plus complet. Je vais certainement regarder dans lxml! Merci! –

+1

minidom est le plus simple, mais aussi le moins * pythonique et le moins complet. Je l'ai utilisé pour faire le travail avant, mais si vous passez beaucoup de temps avec XML, vous l'abandonnerez bientôt. –

2

lxml.objectify fait exactement ce que vous voulez

In [1]: from lxml import objectify 

In [2]: x = objectify.fromstring("""<response><version>1.2</version><amount>1.01</amount><currency>USD</currency></response>""") 

In [3]: x.version 
Out[3]: 1.2 

In [4]: x.amount 
Out[4]: 1.01 

In [5]: x.currency 
Out[5]: 'USD'