8
votes

Comment dois-je analyser cette chaîne XML dans Python?

My XML String est -

$xml = simplexml_load_string($data);
$status = $xml->SMSError;


0 commentaires

4 Réponses :


2
votes

Vous pouvez créer un dictionnaire et obtenir directement des valeurs ...

tree = ET.fromstring(xmlData)

root = {}

for child in tree:
    root[child.tag.split("}")[1]] = child.text

print root["Queued"]


5 commentaires

Salut, vois mon édition. "//Child.tag pour la balise annulée est - { exemple.com } annulé", il est donc difficile de le faire correspondre avec "annulé". Y a-t-il une meilleure façon?


Hey. Cela fonctionne, mais ce n'est qu'un ajustement. Comment accéder au texte des balises d'une manière où la balise est une clé et un texte est la valeur.


Aussi, vous voudrez peut-être changer le retour null à renvoyer aucun ou retour '' . Parce que avec NULL, il dit - NameError: Nom global 'null' n'est pas défini


Ceci peut-être une solution alternative aussi. +1


Réponse mise à jour avec un niquet.



8
votes

Votre document a un espace de noms à ce sujet, vous devez inclure l'espace de noms lors de la recherche: xxx pré>

sortie: p>

nsmap = {'n': 'http://example.com'}
print root.find('n:Sent', namespaces=nsmap)
print root.find('n:MessageID', namespaces=nsmap)


9 commentaires

Donc, fondamentalement, je vais devoir spécifier "{ exemple.com }" Chaque fois que je veux accéder au texte d'une étiquette ?


@Hussaintamboli: Il existe également un noms = mappage argument sur Rechercher et retranchez mais qui semble être inutile lorsqu'il existe un espace de nom par défaut. lxml gère tout cela beaucoup mieux.


Voir la réponse de @ Eclaird. Je pense que vous essayiez de faire la même chose. +1


Il imprime toujours aucun avec nsmap. Je pense qu'il y a quelque chose qui ne va pas avec Nsmap.


@Hussainttamboli: Je reçois la sortie de votre exemple XML. Assurez-vous d'orthographier le nom de la balise correctement ( MessageId et non MessageId ).


J'utilisais xml.etree.elementtree à partir de lien . Je pense que vous utilisez - lxml.etree comme @ @ @root utilise.


@Hussaintamboli: Non, j'utilise xml.etree , python 2.7. LXML prend en charge la même API (bien que certaines améliorations, mais c'est la même dans les deux).


@Hussainttamboli - Le code de Martijn est correct, vous devez avoir commis une erreur quelque part. J'ai écrit le code complet, cela me donne un résultat, essayez de la copier-coller et de voir si cela fonctionne.


Bonjour, root.find ('n: envoyé', espaces de noms = nsmap) imprime l'objet. Ajouter .text .



3
votes

Si vous êtes prêt sur Python Standard XML Bibliothèques, vous pouvez utiliser quelque chose comme ceci:

root = ET.fromstring(xmlData)
namespace = 'http://example.com'

def query(tree, nodename):
    return tree.find('{{{ex}}}{nodename}'.format(ex=namespace, nodename=nodename))

queued = query(root, 'Queued')
print queued.text


0 commentaires

2
votes

avec lxml.etree code>: xxx pré>

avec Elementtree code> Vous pouvez faire: p>

import xml.etree.ElementTree as ET    
root=ET.fromstring(xmlData)    
ns={'n':'http://example.com'}
root.find('n:Queued',namespaces=ns).text
Out[13]: 'false'


1 commentaires

Merci. Je me demandais de trouver quelque chose de similaire à Elementtree. +1