Использование регулярных выражений в синтаксическом анализе xml etree - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно проанализировать XML-файл и найти значения, которые начинаются только с «123». Как я могу сделать это, используя этот код ниже? Можно использовать регулярное выражение в этом синтаксисе?

import xml.etree.ElementTree as ET
parse = ET.parse('xml.xml')
print([ events.text for record in parse.findall('.configuration/system/') for events in record.findall('events')])

xml.xml

<rpc-reply>
 <configuration>
        <system>
            <preference>
                <events>123</events>
                <events>124</events>
                <events>1235</events>                    
            </preference>
        </system>
 </configuration>
</rpc-reply>

1 Ответ

1 голос
/ 07 ноября 2019

Предикат XPath может сделать это с помощью встроенной функции starts-with(). Но вам нужно использовать библиотеку, которая полностью поддерживает XPath 1.0, такую ​​как lxml:

from lxml import etree as ET
raw = '''<rpc-reply>
 <configuration>
        <system>
            <preference>
                <events>123</events>
                <events>124</events>
                <events>1235</events>                    
            </preference>
        </system>
 </configuration>
</rpc-reply>'''
root = ET.fromstring(raw)
query = 'configuration/system/preference/events[starts-with(.,"123")]'
print([events.text for events in root.xpath(query)])

Если вы все еще хотите использовать регулярные выражения, lxml поддерживает регулярные выражения, несмотря на то, что спецификация XPath 1.0 поддерживаетне включает регулярное выражение (см .: регулярное выражение в lxml для python ).

xml.etree поддерживает только ограниченное подмножество XPath 1.0 выражения, которое не включает starts-withфункция (и определенно не поддерживает регулярные выражения). Поэтому вам нужно полагаться на строковую функцию Python, чтобы проверить, что:

....
query = 'configuration/system/preference/events'
print([events.text for events in root.findall(query) if events.text.startswith('123')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...