2013-07-01 5 views
1

Je suis en train d'analyser un fichier xml: http://pastebin.com/fw151jQN Je souhaite le lire en copie et l'écrire dans un nouveau fichier, en partie modifié, beaucoup non modifié, et beaucoup d'entre eux ignorés. Comme une passe initiale, je veux trouver certains xml, et l'écrire dans un nouveau fichier inchangé.Elementtree, vérifie si l'élément a un parent?

Voici la section du xml qui est d'intérêt au premier:

<COMMAND name="shutdown" 
     help="Shutdown the selected interface"> 
     <CONFIG priority="0x7F01" /> 
     <ACTION> 
     /klas/klish-scripts/interfaces.py conf -i ${iface} --enable 0 
     </ACTION> 
    </COMMAND> 

    <COMMAND name="no shutdown" 
     help="Enable the selected interface"> 
     <CONFIG operation="unset" pattern="shutdown"/> 
     <ACTION> 
     /klas/klish-scripts/interfaces.py conf -i ${iface} --enable 1 
     </ACTION> 
    </COMMAND> 

Mon code est ci-dessous

#!/usr/bin/python -tt 

import xml.etree.ElementTree as ET 
tree = ET.parse('interface_range_test.xml') 
root = tree.getroot() 
namespaces = {'command': 'http://clish.sourceforge.net/XMLSchema}COMMAND','config': 'http://clish.sourceforge.net/XMLSchema}CONFIG'} 

all_links = tree.findall('.//') 

for i in all_links: 
    if namespaces['command'] in i.tag: 
     if i.attrib['name'] == "shutdown": 
      print i.attrib  
    if namespaces['config'] in i.tag: 
     print i.attrib 

Sortie:

{'name': 'shutdown', 'help': 'Shutdown the selected interface'} 
{'priority': '0x7F01'} 
{'pattern': 'shutdown', 'operation': 'unset'} 

Ce lit dans le fichier et je peux trouver l'information d'arrêt, maintenant je veux trouver les informations CONFIG, puis le action informations et son texte, mais quand je cherche, il ya CONFIG informations à la fois pour shutdown et no shutdown. Ce cas se produira dans beaucoup de xml, beaucoup ont le même format.

Arrêt: { 'priorité': '0x7F01'} pas d'arrêt: { 'pattern': 'arrêt', 'opération': 'unset'}

Comment puis-je préciser que de regarder , puis-je vérifier le parent de cette information? Ou puis-je vérifier les enfants de l'élément super-dessus (http://clish.sourceforge.net/XMLSchema}COMMAND)?

+0

avez-vous considéré xslt pour cela? après tout, il est conçu pour transformer xml d'une forme à l'autre ... – mata

+0

@mata J'ai peur que le code ne soit dans un script python, ma seule option. – Paul

+0

Doit-on utiliser 'findall ('.//')'? Pourriez-vous simplement parcourir les noeuds d'un niveau? – refi64

Répondre

2

Vous pouvez rechercher toutes les COMMANDES en tant que nœud (élément) et obtenir des informations CONFIG à partir de là, par ex.

import xml.etree.ElementTree as ET 
tree = ET.parse('interface_range_test.xml') 
root = tree.getroot() 

for command in root.iter("{http://clish.sourceforge.net/XMLSchema}COMMAND"): 
    subs = list(command.iter('{http://clish.sourceforge.net/XMLSchema}CONFIG')) 
    if len(subs) > 0: #we found CONFIG 
     print command.tag, command.attrib, subs[0].tag, subs[0].attrib 

Et vous obtiendrez:

{http://clish.sourceforge.net/XMLSchema}COMMAND {'name': 'shutdown', 'help': 'Shutdown the selected interface'} {http://clish.sourceforge.net/XMLSchema}CONFIG {'priority': '0x7F01'} 
{http://clish.sourceforge.net/XMLSchema}COMMAND {'name': 'no shutdown', 'help': 'Enable the selected interface'} {http://clish.sourceforge.net/XMLSchema}CONFIG {'pattern': 'shutdown', 'operation': 'unset'} 

BTW, si vous avez besoin de manipuler de gros fichiers xml, je recommande d'utiliser lxml, qui a également ElementTree compatible interface mais beaucoup plus rapide que lib standard XML de python.

+0

Merci c'est génial! Ensuite, si je voulais l'action tag et son texte, je devrais faire une recherche d'action sur les sous-marins? Ou je pourrais utiliser getchildren? Merci pour l'aide! :) – Paul

+1

@Paul, oui vous pouvez utiliser command.getchildren() ou list (commande) pour obtenir tous les enfants de cet élément, vérifiez http://docs.python.org/2/library/xml.etree.elementtree.html # xml.etree.ElementTree.Element.getchildren pour voir d'autres méthodes prises en charge – number5

+0

merci, aura une autre lecture. – Paul

Questions connexes