Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Парсер XML на python средствами lxml и не только  (Прочитано 2320 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн skytrain

  • Автор темы
  • Участник
  • *
  • Сообщений: 162
    • Просмотр профиля
Доброго времени суток.

Люди добрые. Наведите на ум.
Задача. Добавить вот такой код
      <keybind key="C-A-S-r">
      <action name="Execute">
          <command>killall remmina</command>
      </action>
  </keybind>
в /.config/openbox/lxde-rc.xml

1) Я запутался в типах данных.
   Писал чуть чуть на bash. Там все строковое. это понятно
   Писал на Си. Там жесткая проверка типов. Это понятно.
   А тут
   from lxml import etree
   notes = etree.parse("/home/scatsrv/scripts/python/lxde-rc.xml")
   root = notes.getroot()
   Черт ногу сломит.
   В чем отличие между notes и root?
2) Каким образом осуществляется навигация по тегам в библиотеке lxml
3) и главное.
   Если не затруднит. Каким образом можно получить указатель на искомый тег (и какого он будет типа), и передать его в функцию -     генератор необходимого мне кода. И как мне вообще узнать что я передаю в функцию?

Пользователь решил продолжить мысль 26 Марта 2015, 17:23:08:
import xml.etree.ElementTree as etree
notes = etree.Element("initial")
etree.SubElement(notes, "title").text="title"
etree.SubElement(notes, "title").text="title"
etree.SubElement(notes, "height").text="height"
etree.SubElement(notes, "width").text="width"
new = etree.tostring(notes)
root = etree.parse("/home/scatsrv/scripts/python/lxde-rc.xml") < Вот тут root - это ElementTree.
..............
ИДЕНТИФИКАТОР.append(etree.XML(new)) < А тут нужно что-бы ИДЕНТИФИКАТОР , был типа Element. Есть такие, кто знает, как мне его получить?

Нужна функция, которая по имени\итератору Элемента, возвращает указатель на него.
Люди тыкните носом пжл.
« Последнее редактирование: 26 Марта 2015, 17:23:08 от skytrain »
Не пытайся убежать от себя и от пули. Умрешь уставшим...

Оффлайн skytrain

  • Автор темы
  • Участник
  • *
  • Сообщений: 162
    • Просмотр профиля
Re: Парсер XML на python средствами lxml и не только
« Ответ #1 : 01 Апреля 2015, 13:44:14 »
from lxml import etree
notes = etree.Element("initial")
etree.SubElement(notes, "title").text="title"
etree.SubElement(notes, "title").text="title"
etree.SubElement(notes, "height").text="height"
etree.SubElement(notes, "width").text="width"
new = etree.tostring(notes)
root = etree.parse("/home/scatsrv/scripts/python/lxde-rc.xml")
ww = root.find('{http://openbox.org/3.4/rc}keyboard')
ww.append(etree.XML(new))

handle = etree.tostring(ww, pretty_print=True, encoding='utf-8', xml_declaration=True)
file = open ("/home/scatsrv/scripts/python/rc.xml", "w" )
file.writelines (etree.tostring(handle))
В ответ получаю
Traceback (most recent call last):
  File "/home/scatsrv/scripts/python/keybind.py", line 16, in <module>
    file.writelines (handle)
TypeError: must be str, not int

Подскажите пожалуйста. Как записать handle в файл?
Не пытайся убежать от себя и от пули. Умрешь уставшим...

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: Парсер XML на python средствами lxml и не только
« Ответ #2 : 01 Апреля 2015, 14:07:16 »
Код: (Python) [Выделить]

from lxml import etree

notes = etree.Element("initial")
etree.SubElement(notes, "title").text="title"
etree.SubElement(notes, "title").text="title"
etree.SubElement(notes, "height").text="height"
etree.SubElement(notes, "width").text="width"
root = etree.parse("/home/scatsrv/scripts/python/lxde-rc.xml")
ww = root.find('{http://openbox.org/3.4/rc}keyboard')
ww.append(notes)


etree.ElementTree(root).write('/home/scatsrv/scripts/python/rc.xml', pretty_print=True, encoding='utf-8', xml_declaration=True)

Оффлайн skytrain

  • Автор темы
  • Участник
  • *
  • Сообщений: 162
    • Просмотр профиля
Re: Парсер XML на python средствами lxml и не только
« Ответ #3 : 01 Апреля 2015, 14:30:02 »
Ну почти....
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    etree.ElementTree(root).write('/home/scatsrv/scripts/python/app.xml', pretty_print=True, encoding='utf-8', xml_declaration=True)
TypeError: Argument 'element' has incorrect type (expected lxml.etree._Element, got lxml.etree._ElementTree)
Но макар ясен...
сделал
root.write('/home/scatsrv/scripts/python/app.xml')Получил в итоговом файле
(Нажмите, чтобы показать/скрыть)
&#160; Кто либо знает что это?
« Последнее редактирование: 01 Апреля 2015, 14:31:47 от skytrain »
Не пытайся убежать от себя и от пули. Умрешь уставшим...

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: Парсер XML на python средствами lxml и не только
« Ответ #4 : 01 Апреля 2015, 15:06:29 »
потому что ты параметры убрал:

Код: (Python) [Выделить]
root.write('/home/scatsrv/scripts/python/app.xml', pretty_print=True, encoding='utf-8', xml_declaration=True)

Оффлайн skytrain

  • Автор темы
  • Участник
  • *
  • Сообщений: 162
    • Просмотр профиля
Re: Парсер XML на python средствами lxml и не только
« Ответ #5 : 01 Апреля 2015, 16:19:38 »
Верно.
Спасибо большое.
Не пытайся убежать от себя и от пули. Умрешь уставшим...

 

Страница сгенерирована за 0.043 секунд. Запросов: 25.