Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 15, 2015 17:37:58

fehu
Зарегистрирован: 2015-09-21
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

Есть такой 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 и манипулировать свичем

Отредактировано fehu (Ноя. 15, 2015 17:57:09)

Офлайн

#2 Ноя. 15, 2015 17:49:35

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

Офлайн

#3 Ноя. 15, 2015 17:56:08

fehu
Зарегистрирован: 2015-09-21
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

4kpt_III
css…
Бордер с шириной для наглядности вставил, понимаю что можно css использовать, вопрос то в другом, как логику реализовать более правильно.

Офлайн

#4 Ноя. 15, 2015 18:11:08

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

Это будет вебсервис или локальное приложение? Если вебсервис - возьмите какой-нибудь легковесный фреймверк типа ботла и вперед. А там уже можно и логику организовать. В шаблон сразу передавать ссылку на функцию отображения (вьюху), которая уже и будет работать с snmp. Если же нет - смотрите в сторону графических библиотек Tkiner или PyQt (PySide).

Офлайн

#5 Ноя. 15, 2015 18:22:12

fehu
Зарегистрирован: 2015-09-21
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

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

Офлайн

#6 Ноя. 15, 2015 18:25:18

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

Для сборки html существуют специальны шаблонизаторы.
Можете глянуть в сторону jinja2

P.S. Ботл? Осваивать? Да вопрос 1-2х дней.

Офлайн

#7 Ноя. 15, 2015 18:38:21

fehu
Зарегистрирован: 2015-09-21
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

4kpt_III
Для сборки html существуют специальны шаблонизаторы.Можете глянуть в сторону jinja2P.S. Ботл? Осваивать? Да вопрос 1-2х дней.
Ладно допустим разберусь с ботл, но вопрос остается открытым как мне данные из xml распихать в ячейки такой таблицы, которые я привел во второй картинке, все что у меня получается, все криво либо как выходит как на первой.

Офлайн

#8 Ноя. 15, 2015 18:41:37

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

Я не пойму. Путаете следы как профессиональный заяц-рысак. Вы xml не можете распарсить?

Офлайн

#9 Ноя. 15, 2015 18:46:48

fehu
Зарегистрирован: 2015-09-21
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

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>

Отредактировано fehu (Ноя. 15, 2015 18:47:17)

Офлайн

#10 Ноя. 15, 2015 19:10:20

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Помогите распарсить xml в табличку

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version