2013-07-01 2 views
1

Я разбираю файл xml: http://pastebin.com/fw151jQN Я хочу прочитать его в копии и записать его в новый файл, некоторые из которых модифицированы, многие из них не модифицированы, и многие из них игнорируются. В качестве начального прохода я хочу найти определенный xml и записать его в новый файл без изменений.Elementtree, проверьте, имеет ли элемент определенный родитель?

Вот раздел XML, который представляет интерес в первую:

<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> 

Мой код ниже

#!/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 

Выход:

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

Об этом говорится в файле и я могу найти информацию о завершении работы, теперь я хочу найти информацию CONFIG, а затем action информация и текст, но при поиске CONFIG информация как для shutdown, так и для no shutdown. Этот случай будет происходить во множестве xml, у него много одинакового формата.

Shutdown: { 'Приоритет': '0x7F01'} нет отключения: { 'шаблон': 'выключение', 'работа': 'сбросьте}

Как я могу определить, какие смотреть , могу ли я проверить родителя этой информации? Или я могу проверить детей над суперэлементом над ним (http://clish.sourceforge.net/XMLSchema}COMMAND)?

+0

Вы считаете xslt для этого? в конце концов, он предназначен для преобразования xml из одной формы в другую ... – mata

+0

@mata Я боюсь, что код должен войти в скрипт python, мой единственный вариант. – Paul

+0

Вам нужно использовать 'findall ('.//')'? Не могли бы вы просто перебрать узлы на одном уровне? – refi64

ответ

2

Вы можете искать все КОМАНДЫ как узел (элемент) и получать информацию CONFIG оттуда, например.

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 

И вы получите:

{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'} 

Кстати, если вам нужно обработки больших XML-файлов, я бы рекомендовал использовать lxml, который также имеет ElementTree compatible interface, но гораздо быстрее, чем стандартный XML Lib питона.

+0

Спасибо, это здорово! Тогда, если мне нужен тег действия и его текст, мне нужно будет выполнить поиск действий на субмаринах? Или я мог бы использовать getchildren? Спасибо за помощь! :) – Paul

+1

@Paul, да, вы можете использовать команду command.getchildren() или list (command), чтобы получить все дочерние элементы этого элемента, проверьте http://docs.python.org/2/library/xml.etree.elementtree.html # xml.etree.ElementTree.Element.getchildren, чтобы увидеть другие поддерживаемые методы – number5

+0

спасибо, будет прочитано дополнительно. – Paul

Смежные вопросы