2009-07-20 9 views
0

Je voudrais obtenir quelques lignes (z: rangée lignes) de XML en utilisant:Obtenir les lignes de XML en utilisant XPath et Python

<rs:data> 
    <z:row Attribute1="1" Attribute2="1" /> 
    <z:row Attribute1="2" Attribute2="2" /> 
    <z:row Attribute1="3" Attribute2="3" /> 
    <z:row Attribute1="4" Attribute2="4" /> 
    <z:row Attribute1="5" Attribute2="5" /> 
    <z:row Attribute1="6" Attribute2="6" /> 
</rs:data> 

Je vais avoir du mal à utiliser (Python):

ElementTree.parse('myxmlfile.xml').getroot().findall('//z:row') 

Je pense que deux points ne sont pas valides dans ce cas.

Quelqu'un sait comment je peux faire cela?

+0

XPathGet est une fonction? De quel environnement de programmation? – Cheeso

+0

Considérez XPathGet comme une fonction qui renvoie tous les nœuds. – Zanoni

Répondre

1

Si je définis les espaces de noms comme celui-ci:

<?xml version="1.0"?> 
<rs:data xmlns="http://example.com" xmlns:rs="http://example.com/rs" xmlns:z="http://example.com/z"> 
    <z:row Attribute1="1" Attribute2="1" /> 
    <z:row Attribute1="2" Attribute2="2" /> 
    <z:row Attribute1="3" Attribute2="3" /> 
    <z:row Attribute1="4" Attribute2="4" /> 
    <z:row Attribute1="5" Attribute2="5" /> 
    <z:row Attribute1="6" Attribute2="6" /> 
</rs:data> 

peut être utilisé le -API Python ElementTree comme ceci:

ElementTree.parse("r.xml").getroot().findall('{http://example.com/z}row') 
# => [<Element {http://example.com/z}row at 551ee0>, <Element {http://example.com/z}row at 551c60>, <Element {http://example.com/z}row at 551f08>, <Element {http://example.com/z}row at 551be8>, <Element {http://example.com/z}row at 551eb8>, <Element {http://example.com/z}row at 551f30>] 

Voir aussi http://effbot.org/zone/element.htm#xml-namespaces

+1

Le tutoriel lxml peut être plus utile: http://codespeak.net/lxml/tutorial.html#namespaces – tgray

+0

Rappelez-vous simplement que "importer lxml.etree" == "importer xml.etree.ElementTree en etree" avec quelques exceptions . – tgray

1

Si vous ne voulez pas comprendre correctement la mise en place des espaces de noms, vous pouvez les ignorer comme ceci:

XPathGet("//*[local-name() = 'row']") 

qui sélectionne chaque nœud dont le nom (sans espace de noms) est row.

1

Les préfixes "z:" représentent un espace de noms XML. vous aurez besoin de savoir ce que l'espace de noms est, et effectuer les opérations suivantes:

XmlDocument doc = new XmlDocument(); 
doc.Load(@"File.xml"); 
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); 
ns.AddNamespace("z", @"http://thenamespace.com"); 
XmlNodeList nodes = doc.SelectNodes(@"//z:row", ns); 
Questions connexes