Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Разобрать xml файл...


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

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

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

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


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



Автор: albertn 31.8.2006, 10:00
А зачем 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

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

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

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

не знаю зачем... я тока начинаю разбираться с питоном... 
нашел вот http://mail.python.org/pipermail/python-list/2003-December/197961.html 
и решил что нужно - ведь мне именно XPath нужен. 

Автор: albertn 31.8.2006, 10:30
Цитата(ols @ 31.8.2006,  10:24)
не знаю зачем... я тока начинаю разбираться с питоном... 
нашел вот http://mail.python.org/pipermail/python-list/2003-December/197961.html 
и решил что нужно - ведь мне именно XPath нужен.

Ну если именно XPath нужен, то да. Я кстати бегло просмотрел, эта библиотека просто добавляет несколько функций в основную библиотеку.
Честно говоря никогда не использовал XPath, и не видел в нем необходимости. Может и зря конечно, но не юзал, не знаю.

Автор: ols 31.8.2006, 10:30
Цитата(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 

Автор: albertn 31.8.2006, 10:44
Цитата(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)

По-идее должно работать, проверить не могу.

Автор: ols 31.8.2006, 11:06
получилось так: 
Код

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
?

Автор: albertn 31.8.2006, 11:10
Цитата(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

Автор: ols 31.8.2006, 11:18
не работает... smile 

Автор: albertn 31.8.2006, 11:21
Цитата(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

Автор: 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'
>>> 

Автор: ols 31.8.2006, 11:40
Отлично! 
Спасибо всем большое smile  
Осталось запихнуть это всё в модуль чтобы больше не вспоминать   smile 


Автор: albertn 31.8.2006, 11:41
Цитата(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'
>>> 

Сто-пудов, этож список. У меня просто вариантов небыло проверить, а на вывод не обратил внимание.

Автор: ols 31.8.2006, 12:44
готово. мой первый класс на питоне! 
Назначение: Читает файл ресурсов, написанный в 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
Я случайно велосипед не изобрел?

Автор: albertn 31.8.2006, 13:07
Цитата(ols @  31.8.2006,  12:44 Найти цитируемый пост)
Я случайно велосипед не изобрел?

Ну если так посмотреть, то ты ничего не изобрел smile

А по сути комманде parse по-моему можно просто передать имя файла.
Получать только значение nodeValue тоже не всегда надо.

PS. Если это твой первый класс на питоне, то все вроде нормально, но с точки зрения применения разве что в некоторых случаях сократит запись, хотя и не факт:
Код

import xml, xml.dom.minidom
print xml.xpath.Evaluate('/resourse/main_menu/item[@name="about"]/text()',xml.dom.minidom.parse('res/main_menu_res.xml')).nodeValue

Автор: ols 31.8.2006, 13:32
Спасибо. 
В питоне 3-й день... до этого кроме как на PL/SQL несколько лет уж ни на чем не писал... а там это делается совсем иначе
поэтому и вопросов куча... 

Автор: pythonwin 31.8.2006, 14:52
ols, прерасно для 3-х дней.


Цитата(ols @  31.8.2006,  20:32 Найти цитируемый пост)
до этого кроме как на PL/SQL несколько лет уж ни на чем не писал

а какая СУБД?

Автор: J2A 31.8.2006, 15:08
Цитата(pythonwin @ 31.8.2006,  17:52)
ols, прерасно для 3-х дней.


Цитата(ols @  31.8.2006,  20:32 Найти цитируемый пост)
до этого кроме как на PL/SQL несколько лет уж ни на чем не писал

а какая СУБД?

Глупый вопрос. http://en.wikipedia.org/wiki/PLSQL - это однозначно Oracle.

Автор: pythonwin 31.8.2006, 15:45
Цитата(J2A @  31.8.2006,  22:08 Найти цитируемый пост)
 PL/SQL - это однозначно Oracle. 


а я думал что и другие SQL-ые СУБД могут поддерживать PL/SQL
например PostgreSQL
http://www.postgresql.org/files/documentation/books/pghandbuch/html/plpgsql.html

когда устанавливал Postgresql под винду видел галочку PL/SQL

Хотя сам на PL/SQL в PostgrSQL-е не писал.

Добавлено @ 15:45 
http://search.postgresql.org/www.search?cs=utf-8&fm=on&gr=on&o=0&ps=20&s=rate&q=PL%2FSQL&submit=Search

Автор: J2A 31.8.2006, 16:05
Цитата(pythonwin @ 31.8.2006,  18:45)
Цитата(J2A @  31.8.2006,  22:08 Найти цитируемый пост)
 PL/SQL - это однозначно Oracle. 


а я думал что и другие SQL-ые СУБД могут поддерживать PL/SQL
например PostgreSQL

Может не будем уходить от основной темы? 
http://en.wikipedia.org/wiki/PL/pgSQL != http://en.wikipedia.org/wiki/PL/SQL.

P.S. Ныне модно давать ссылки на немецкую документацию?

Автор: pythonwin 31.8.2006, 16:20
Цитата(J2A @  31.8.2006,  23:05 Найти цитируемый пост)

Может не будем уходить от основной темы? 
PL/pgSQL != PL/SQL.


http://www.postgresql.org/docs/7.3/static/plpgsql.html

Цитата

Porting from Oracle PL/SQL



http://pgfoundry.org/projects/protopg


На PL/SQL не писал, но IMHO, что его может поддерживать не только Oracle, хотя я могу и ошибаться... smile

Добавлено @ 16:21 
http://www.google.ru/search?sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-31,GGGL:ru&q=site%3Awww.postgresql.org+%22PL%2FSQL%22
smile

Автор: Cr@$h 31.8.2006, 17:56

M
Cr@$h
albertn ++ за помощь новичку и поддержку.
 

Автор: pythonwin 1.9.2006, 07:38
Cr@$h, Дык... а уже поставил... Но ничего думаю, что albertn, не растроиться. smile

Автор: albertn 1.9.2006, 08:52
Цитата(pythonwin @ 1.9.2006,  07:38)
Cr@$h, Дык... а уже поставил... Но ничего думаю, что albertn, не растроиться. smile

Не обижусь smile
Спасибо

Автор: pythonwin 1.9.2006, 08:56
Цитата(albertn @  1.9.2006,  15:52 Найти цитируемый пост)
Спасибо

Пожалуйста!

Автор: Cr@$h 1.9.2006, 22:04
Цитата(pythonwin @  1.9.2006,  08:38 Найти цитируемый пост)
Cr@$h, Дык... а уже поставил... Но ничего думаю, что albertn, не растроиться. 

Да, за один пост знаю люди по несколько ++ ухватывали на Винграде, и это хорошо. Каждый может ставить, а если что-то понравилось нескольким, то "несколькие" и поставят несколько smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)