2014-10-29 7 views
0

У меня есть XML со следующей структурой:XPath поиска элемента по значению детской

<?xml version="1.0" encoding="iso-8859-2"?> 
<partners> 
    <partner> 
    <id>001</id> 
    ... 
    </partner> 
    <partner> 
    <id>002</id> 
    ... 
    </partner> 
    ... 
</partners> 

Я хочу найти партнера с заданным идентификатором, с помощью XPath. Я использую python xml.etree, но в этом случае это может быть неактуально. До сих пор я пытаюсь: './partner[/id = "001"]' найти партнера, который имеет идентификатор = 001:

for e in doc.findall('./partner[/id = "001"]'): print e 

и это вызывает ошибку синтаксиса SyntaxError: expected path separator ([), полный трассировку стека:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/xml/etree/ElementTree.py", line 647, in findall 
    return self._root.findall(path) 
    File "/usr/lib/python2.6/xml/etree/ElementTree.py", line 355, in findall 
    return ElementPath.findall(self, path) 
    File "/usr/lib/python2.6/xml/etree/ElementPath.py", line 198, in findall 
    return _compile(path).findall(element) 
    File "/usr/lib/python2.6/xml/etree/ElementPath.py", line 176, in _compile 
    p = Path(path) 
    File "/usr/lib/python2.6/xml/etree/ElementPath.py", line 93, in __init__ 
    "expected path separator (%s)" % (op or tag) 
SyntaxError: expected path separator ([) 

Может кто-нибудь мне точку Что я делаю не так?


редактировать: Я боюсь, что это связано с версией Python 2.6.8 используется. В этом случае документы немного отличаются: https://docs.python.org/release/2.6.8/library/xml.etree.elementtree.html. И нет, я не могу обновить версию python, к сожалению ...

ответ

1

XPath support of xml.etree.ElementTree is limited. Как насчет использования lxml? используя xpath method

>>> x = '''<?xml version="1.0" encoding="iso-8859-2"?> 
... <partners> 
... <partner> 
...  <id>001</id> 
... </partner> 
... <partner> 
...  <id>002</id> 
... </partner> 
... </partners>''' 
>>> 
>>> import lxml.etree 
>>> root = lxml.etree.fromstring(x) 
>>> root.xpath('.//partner[id/text()="001"]') 
[<Element partner at 0x2e29090>] 
+0

К счастью, у меня установлен этот модуль на сервере, над которым я должен работать. Работает отлично! – ducin

Смежные вопросы