Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разобрать xml файл... ...используя XPath 
V
    Опции темы
ols
Дата 31.8.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.8.2006
Где: Прага

Репутация: нет
Всего: 1



Есть xml файл. 
Нужно используя XPath выражение выбрать в некую переменную из этого файла значение некоторого узла... 

PyXML поставил, но с ходу что-то найти пример не могу. 

условно содержимое файла: 
Код

<a>
  <b>ASD</b>
</a>


Xpath выражение: 
Код
/a/b/text()



PM MAIL WWW   Вверх
albertn
Дата 31.8.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



А зачем PyXML, по-моему у питона есть и своя нормальная библиотека для работы с XML.
Описание модуля:
http://docs.python.org/lib/module-xml.dom.minidom.html
http://docs.python.org/lib/dom-objects.html
Пример:
http://docs.python.org/lib/dom-example.html
PM WWW ICQ   Вверх
albertn
Дата 31.8.2006, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



А если в PyXML, то выглядеть должно где-то так
Код

from xml import xpath
nodes = xpath.Evaluate('quotation/note', doc.documentElement)

PM WWW ICQ   Вверх
ols
Дата 31.8.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.8.2006
Где: Прага

Репутация: нет
Всего: 1



Цитата(albertn @ 31.8.2006,  10:00)
А зачем PyXML, по-моему у питона есть и своя нормальная библиотека для работы с XML.

не знаю зачем... я тока начинаю разбираться с питоном... 
нашел вот message 
и решил что нужно - ведь мне именно XPath нужен. 

PM MAIL WWW   Вверх
albertn
Дата 31.8.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(ols @ 31.8.2006,  10:24)
не знаю зачем... я тока начинаю разбираться с питоном... 
нашел вот message 
и решил что нужно - ведь мне именно XPath нужен.

Ну если именно XPath нужен, то да. Я кстати бегло просмотрел, эта библиотека просто добавляет несколько функций в основную библиотеку.
Честно говоря никогда не использовал XPath, и не видел в нем необходимости. Может и зря конечно, но не юзал, не знаю.
PM WWW ICQ   Вверх
ols
Дата 31.8.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.8.2006
Где: Прага

Репутация: нет
Всего: 1



Цитата(albertn @ 31.8.2006,  10:16)
А если в PyXML, то выглядеть должно где-то так
Код

from xml import xpath
nodes = xpath.Evaluate('quotation/note', doc.documentElement)

простите за глупый вопрос... 
а как в doc.documentElement  считать содержимое файла?

Добавлено @ 10:33 
Цитата(albertn @ 31.8.2006,  10:30)
Честно говоря никогда не использовал XPath, и не видел в нем необходимости. Может и зря конечно, но не юзал, не знаю.

да я к нему просто привык очень, честно говоря не знаю, как без него обходится smile 
в oracle без него никак smile 
PM MAIL WWW   Вверх
albertn
Дата 31.8.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(ols @ 31.8.2006,  10:30)
простите за глупый вопрос... 
а как в doc.documentElement  считать содержимое файла?

Если я не ошибаюсь, то должно выглядеть так:
Код

from xml.dom.minidom import parseString
text = """
<a>
  <b>ASD</b>
</a>
"""
doc = parseString(text)
res = xpath.Evaluate('/a/b/text()', doc.documentElement)

По-идее должно работать, проверить не могу.
PM WWW ICQ   Вверх
ols
Дата 31.8.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.8.2006
Где: Прага

Репутация: нет
Всего: 1



получилось так: 
Код

from xml.dom.minidom import parse
from xml import xpath
fres = open('file_path/file.xml','r')
xres = parse(fres)
xvar = xpath.Evaluate('/a/b/text()',xres)
str(xvar)


но выводит он 
[<DOM Text node "ASD">]

а как вывести просто 
ASD
?
PM MAIL WWW   Вверх
albertn
Дата 31.8.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(ols @ 31.8.2006,  11:06)
но выводит он 
[<DOM Text node "ASD">]

а как вывести просто 
ASD
?

Вроде так:
Код

from xml.dom.minidom import parse
from xml import xpath
fres = open('file_path/file.xml','r')
xres = parse(fres)
xvar = xpath.Evaluate('/a/b/text()',xres)
print xvar.data


Это сообщение отредактировал(а) albertn - 31.8.2006, 11:15
PM WWW ICQ   Вверх
ols
Дата 31.8.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.8.2006
Где: Прага

Репутация: нет
Всего: 1



не работает... smile 
PM MAIL WWW   Вверх
albertn
Дата 31.8.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(ols @ 31.8.2006,  11:18)
не работает... smile

А, точто, должно быть так:
Код

from xml.dom.minidom import parse
from xml import xpath
fres = open('file_path/file.xml','r')
xres = parse(fres)
xvar = xpath.Evaluate('/a/b/text()',xres)
print xvar.nodeValue

PM WWW ICQ   Вверх
J2A
Дата 31.8.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Код

>>> from xml.dom.minidom import parse
>>> from xml import xpath            
>>> from cStringIO import StringIO
>>> xparse = parse(StringIO('<a><b>ASD</b></a>'))
>>> xvars = xpath.Evaluate('/a/b/text()', xparse)
>>> type(xvars)
<type 'list'>
>>> type(xvars[0])
<type 'instance'>
>>> xvars[0]
<DOM Text node "ASD">
>>> xvars[0].nodeValue
u'ASD'
>>> 

--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
ols
Дата 31.8.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.8.2006
Где: Прага

Репутация: нет
Всего: 1



Отлично! 
Спасибо всем большое smile  
Осталось запихнуть это всё в модуль чтобы больше не вспоминать   smile 


PM MAIL WWW   Вверх
albertn
Дата 31.8.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(J2A @ 31.8.2006,  11:25)
Код

>>> from xml.dom.minidom import parse
>>> from xml import xpath            
>>> from cStringIO import StringIO
>>> xparse = parse(StringIO('<a><b>ASD</b></a>'))
>>> xvars = xpath.Evaluate('/a/b/text()', xparse)
>>> type(xvars)
<type 'list'>
>>> type(xvars[0])
<type 'instance'>
>>> xvars[0]
<DOM Text node "ASD">
>>> xvars[0].nodeValue
u'ASD'
>>> 

Сто-пудов, этож список. У меня просто вариантов небыло проверить, а на вывод не обратил внимание.
PM WWW ICQ   Вверх
ols
Дата 31.8.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.8.2006
Где: Прага

Репутация: нет
Всего: 1



готово. мой первый класс на питоне! 
Назначение: Читает файл ресурсов, написанный в xml, и возвращает нужную ноду по XPath.

Прошу заценить и сильно не ругаться: 

Код

# resourse_parse.py
# Parse an xml resourse file

from xml.dom.minidom import parse
from xml import xpath

class Resourse:
    def __init__(self, ini_path):
        self.bind_resourse(ini_path)

    def bind_resourse(self, res_path):
    # Binds a resourse with a real file
        fres = open(res_path, 'r')
        self.xres = parse(fres)
        fres.close()        

    def extract_item(self, entry_path):
    # Extracts value from resourse file by XPath expression 
        xvar = xpath.Evaluate(entry_path, self.xres)
        if xvar:
            return xvar[0].nodeValue      


Пример использования: 
Код

import resourse_parse
menu_res = resourse_parse.Resourse('res/main_menu_res.xml')
iAbout = menu_res.extract_item('/resourse/main_menu/item[@name="about"]/text()')
print iAbout


PS
Я случайно велосипед не изобрел?

Это сообщение отредактировал(а) ols - 31.8.2006, 13:23
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1989 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.