2010-06-10 7 views
0

J'ai le code XML suivant dans une chaîne nommée « xml »:Parsing XML en utilisant xml.etree.cElementTree

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Book> 
    <Page> 
    <Text>Blah</Text> 
    </Page> 
</Book> 

J'essaie d'obtenir la valeur Blah hors de lui, mais je vais avoir du mal avec xml.etree.cElementTree. J'ai essayé les méthodes find() et findtext() mais rien. Finalement, je l'ai fait:

import xml.etree.cElementTree as ET 
... 
root = ET.fromstring(xml) 
element = root.getchildren()[0].getchildren()[0] 

Element est maintenant égal à l'élément, qui est ce que je veux (pour cette solution de toute façon), mais comment puis-je obtenir le texte intérieur de celui-ci? element.text ne fonctionne pas. Des idées?

EDIT: element.text me donne Aucun

PS: J'utilise Python 2.5 atm. Comme une question supplémentaire: quelle est une meilleure façon d'analyser les chaînes xml en python?

+0

Alors, quel était le problème? –

+0

Eh bien, nous avons notre propre IDE qui simule notre environnement prod. Quand je cours ce code en mode DEBUG cela ne fonctionne pas, mais quand je compile et l'exécute cela fonctionne très bien. Donc je suppose que c'est un bug dans notre IDE. – Andre

Répondre

3

Veuillez expliquer ce que «ne fonctionne pas» signifie pour vous. Ce que je devine est le code que vous avez couru (ou auriez dû exécuter) travaillé pour moi (Python 2.x pour x dans (5, 6)) - voir ci-dessous. Il a même travaillé sur Python 2.1 avec la modification appropriée de l'instruction import. Notez que j'ai affiché element.tag pour montrer qu'il fait référence à l'élément désiré.

>>> xml = """\ 
... <?xml version="1.0" encoding="ISO-8859-1"?> 
... <Book> 
... <Page> 
...  <Text>Blah</Text> 
... </Page> 
... </Book> 
... """ 
>>> import xml.etree.cElementTree as ET 
>>> root = ET.fromstring(xml) 
>>> element = root.getchildren()[0].getchildren()[0] 
>>> element.tag 
'Text' 
>>> element.text 
'Blah' 
>>> 

Peut-être que vous souhaitez prendre une pluie contrôle sur votre question supplémentaire avant que nous obtenons la première triée ;-)

+0

OK, je ne sais pas ce qui a changé, mais j'ai copié et collé votre code et ça marche. Quel début de journée ... – Andre

0

Pour .xmls non massives (quelques Mo peut-être) la comme vous le faites, ça devrait aller, mais si vous connaissez la balise et que vous voulez juste la valeur en sortie, j'ai trouvé un moyen de le faire grâce à http://enginerds.craftsy.com/blog/2014/04/parsing-large-xml-files-in-python-without-a-billion-gigs-of-ram.html mais je l'ai modifié pour mes besoins et je n'ai même pas besoin de xml.etree du tout. Par exemple:

path = 'yourxmlfilepath.xml' 
tagyouwant='Headline' #just an example, i wanted the text between 'Headline' tags 
opentag='<'+tagyouwant+'>' 
closetag='</'+tagyouwant+'>' 

with open(path,'rb') as inputfile: 
    for line in inputfile: 
     if opentag in line: 
      strtoget=str(line) 
      strtoget=strtoget.replace(opentag,"") #trimming the tags from the text 
      strtoget=strtoget.replace(closetag,"") 
      print strtoget 

au lieu de la déclaration finale de l'impression que vous pouvez faire ce que vous voulez avec la chaîne que vous avez maintenant. Alternativement, vous pouvez aussi l'exécuter en batch ou en ligne de commande et le sortir en .txt et stocker toutes les valeurs comme vous le faites (cela dépend vraiment de ce que vous voulez faire avec).

Quoi qu'il en soit, je pensais que c'était un moyen intelligent et efficace pour analyser les énormes fichiers xml lorsque vous savez exactement ce que vous voulez en tirer.

+0

@Andre ... merci pour le commentaire, très constructif. Autant que je sache, les fichiers XML sont encore assez courants et ces problèmes existent! par conséquent pourquoi j'ai rencontré le problème et ai pensé qu'il pourrait être utile pour d'autres de voir comment je l'ai résolu. – Vlox