lxml xpath Как работать с сущностями xml - PullRequest
0 голосов
/ 14 ноября 2018

Я использую lxml (Python 3.7.1) для анализа xml-документа, содержащего xml-сущности. Мне не удается получить правильный синтаксис для запроса элемента, содержащего объекты XML (&quot, ' и т. Д.).
См. Следующий код:

from lxml import etree

root = etree.XML('''
<root>
    <item name="abcd">
        <ssitem att="efg"/>
    </item>
    <item name="hi&apos;jk">
        <ssitem att="lmn"/>
    </item>
</root>
''')

item = root.xpath(".//item[@name='abcd']") # 1
# item = root.xpath(".//item[@name='hi&apos;jk']") # 2
# item = root.xpath(".//item[@name='hi'jk']") # 3
# item = root.xpath('.//item[@name="hi''jk"]') # 4
if len(item) != 0:
    print(len(item))
    print(item)
    name = item[0].xpath(".//@name")
    print(name)
else:
    print("Nothing")  

Когда строка 1 не закомментирована, код работает нормально.

Когда строка 2 (или 3, или 4) не закомментирована (а другие строки закомментированы), ничего не найдено.

Почему это так?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Подумайте о том, чтобы избежать одиночного апострофа с последним параметром # 4:

item = root.xpath('.//item[@name="hi\'jk"]') # 4
item

# [<Element item at 0xbe25608>]
0 голосов
/ 14 ноября 2018

Здесь &apos; является частью кодировки в файле XML.

В запросе XPath вы должны использовать:

>>> root.xpath(""".//item[@name="hi'jk"]""")
[<Element item at 0x7f91b2b9ae88>]
...