Найти - Пользователи
Полная версия: Помогите распарсить xml в табличку
Начало » Python для новичков » Помогите распарсить xml в табличку
1 2
fehu
Есть такой xml файл, мне нужно сформировать таблицу
<TreeRoot>
  <Switch1>
    <id>1</id>
    <ip>10.0.0.1</ip>
    <hostname>zyxel</hostname>
    <description>misowskaja</description>
    <templateswitch>zyxel</templateswitch>
    <icmp>fail</icmp>
  </Switch1>
  <Switch2>
    <id>2</id>
    <ip>10.0.0.2</ip>
    <hostname>zyxel</hostname>
    <description>misowskaja2</description>
    <templateswitch>zyxel</templateswitch>
    <icmp>fail</icmp>
  </Switch2>
</TreeRoot>
У меня получается пока спарсить так
XML_FILE = 'xmlfile.xml'
tree = ET.parse(XML_FILE)
root = tree.getroot()
tag = []
text = []
start = 0
end = 7
for elem in root.getiterator():
    if elem.tag == "TreeRoot":
        continue
    tag.append(elem.tag)
    text.append(elem.text)
print '<table border="2px" width="100%">'
for x in tag:
    if x.startswith('Sw'):
        print '<tr>'
        print '<td rowspan="2">', x, '</td>'
    elif x.endswith('icmp'):
        print '<th>', x, '</th></tr>'
        print '<tr>'
        for y in text[start:end]:
            if y == '\n    ':
                start += 1
                end += 1
                continue
            print '<td>', y, '</td>'
            start += 1
            end += 1
        print '</tr>'
    else:
        print '<th>', x, '</th>'
print '</table>'
В итоге получаю такую картинку

А нужно так

PS:Реализовать нужно логику, а не оформление. И как еще что бы при клики мышки по полю у меня отправляло на обработчик в который будет отправляться текущий ip, либо сделать дополнительное поле\кнопку при нажатии на которую будет перекидывать на обработчик. А дальше я уже буду подключатся по snmp и манипулировать свичем
4kpt_III
css…
fehu
4kpt_III
css…
Бордер с шириной для наглядности вставил, понимаю что можно css использовать, вопрос то в другом, как логику реализовать более правильно.
4kpt_III
Это будет вебсервис или локальное приложение? Если вебсервис - возьмите какой-нибудь легковесный фреймверк типа ботла и вперед. А там уже можно и логику организовать. В шаблон сразу передавать ссылку на функцию отображения (вьюху), которая уже и будет работать с snmp. Если же нет - смотрите в сторону графических библиотек Tkiner или PyQt (PySide).
fehu
4kpt_III
Это будет вебсервис или локальное приложение? Если вебсервис - возьмите какой-нибудь легковесный фреймверк типа ботла и вперед. А там уже можно и логику организовать. В шаблон сразу передавать ссылку на функцию отображения (вьюху), которая уже и будет работать с snmp. Если же нет - смотрите в сторону графических библиотек Tkiner или PyQt (PySide).
С фреймворками боюсь не успею разобраться, до диплома чуть чуть осталось. Будет веб приложение в нем функционал, отображение состояние коммутаторов (что сейчас пытаюсь сделать), добавление, удаление, бд в xml лежит отправляется через форму get запросом(значения принимаю через cgi), часть уже реализовал.
Сейчас хочу именно html табличку сформировать так как на второй картинке, но не понимаю как это можно завернуть в код, получается либо дублирование либо все вставляется не на свои места.
4kpt_III
Для сборки html существуют специальны шаблонизаторы.
Можете глянуть в сторону jinja2

P.S. Ботл? Осваивать? Да вопрос 1-2х дней.
fehu
4kpt_III
Для сборки html существуют специальны шаблонизаторы.Можете глянуть в сторону jinja2P.S. Ботл? Осваивать? Да вопрос 1-2х дней.
Ладно допустим разберусь с ботл, но вопрос остается открытым как мне данные из xml распихать в ячейки такой таблицы, которые я привел во второй картинке, все что у меня получается, все криво либо как выходит как на первой.
4kpt_III
Я не пойму. Путаете следы как профессиональный заяц-рысак. Вы xml не можете распарсить?
fehu
4kpt_III
не м
Да, именно xml. В заголовке про это и писал. Но за подсказку про ботл спасибо
На выходе хочу получать табличку вида, где в каждую ячейку будут падать значения из xml
<table>
    <tr>
        <th>name</th>
        <th>id</th>
        <th>ip</th>
        <th>hostname</th>
        <th>description</th>
        <th>templateswitch</th>
        <th>icmp</th>
    </tr>
    <tr>
        <td>sw1</td>
        <td>1</td>
        <td>10.0.0.1</td>
        <td>zyxel</td>
        <td>lenina1</td>
        <td>zyxel</td>
        <td>ok</td>
    </tr>
    <tr>
        <td>sw2</td>
        <td>2</td>
        <td>10.0.0.1</td>
        <td>zyxel</td>
        <td>lenin2</td>
        <td>zyxel</td>
        <td>fail</td>
    </tr>
</table>
4kpt_III
id в таблице работает как ссылка, которая должна ссылаться на функцию-отображение, которая должна выполнять необходимые операции (сейчас там просто заглушка).

xml_template = """
<TreeRoot>
  <Switch1>
    <id>1</id>
    <ip>10.0.0.1</ip>
    <hostname>zyxel</hostname>
    <description>misowskaja</description>
    <templateswitch>zyxel</templateswitch>
    <icmp>fail</icmp>
  </Switch1>
  <Switch2>
    <id>2</id>
    <ip>10.0.0.2</ip>
    <hostname>zyxel</hostname>
    <description>misowskaja2</description>
    <templateswitch>zyxel</templateswitch>
    <icmp>fail</icmp>
  </Switch2>
</TreeRoot>
"""
#
html_template = """
<table>
    <tr>
        <th>name</th>
        <th>id</th>
        <th>ip</th>
        <th>hostname</th>
        <th>description</th>
        <th>templateswitch</th>
        <th>icmp</th>
    </tr>
    {% for swt in switch %}
        <tr>
            <td>{{ swt }}</td>
            <td><a href="#">{{ switch[swt]["id"] }}</a></td>
            <td>{{ switch[swt]["ip"] }}</td>
            <td>{{ switch[swt]["hostname"] }}</td>
            <td>{{ switch[swt]["description"] }}</td>
            <td>{{ switch[swt]["templateswitch"] }}</td>
            <td>{{ "problem" if switch[swt]["icmp"] == "failure" else "ok" }}</td>
        </tr>
    {% endfor %}
</table>
"""
#
#
from collections import OrderedDict
import xml.etree.ElementTree as ET
import jinja2
#
root = ET.fromstring(xml_template)
result = OrderedDict()
#
for child in root:
    params = OrderedDict()
    for param in child:
        params[param.tag] = param.text
    result[child.tag] = params
#
print(jinja2.Template(html_template).render(switch=result))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB