Найдите элемент с атрибутом с minidom

Данный

<field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame: 0.000008000 seconds" size="0" pos="0" show="0.000008000"/>
<field name="frame.time_relative" showname="Time since reference or first frame: 0.000008000 seconds" size="0" pos="0" show="0.000008000"/>
<field name="frame.number" showname="Frame Number: 2" size="0" pos="0" show="2"/>
<field name="frame.pkt_len" showname="Packet Length: 1506 bytes" hide="yes" size="0" pos="0" show="1506"/>
<field name="frame.len" showname="Frame Length: 1506 bytes" size="0" pos="0" show="1506"/>
<field name="frame.cap_len" showname="Capture Length: 1506 bytes" size="0" pos="0" show="1506"/>
<field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
<field name="frame.protocols" showname="Protocols in frame: eth:ip:tcp:http:data" size="0" pos="0" show="eth:ip:tcp:http:data"/>

Как я получаю поле с именем = "frame.len" сразу же, не выполняя итерации через каждый тег и проверяя атрибуты?

9
задан xster 10 March 2010 в 07:11
поделиться

2 ответа

Не думаю, что ты сможешь.

Из родительского элемента вам необходимо

for subelement in element.GetElementsByTagName("field"):
    if subelement.hasAttribute("frame.len"):
        do_something()

В ответ на ваш комментарий от 11 марта, если структура ваших документов стабильна и не содержит неприятных сюрпризов (например, угловых скобок внутри атрибутов), вы может захотеть попробовать немыслимое и использовать регулярное выражение. Это не рекомендуется, но может работать и быть намного проще, чем анализировать файл на самом деле. Признаюсь, я сам иногда это делал. Еще не ослеп.

Итак, в вашем случае вы можете (при условии, что тег не охватывает несколько строк):

xmlfile = open("myfile.xml")
for line in xmlfile:
    match = re.search(r'<field\s+name="frame.len"\s+([^>]+)/>', line):
    if match:
        result = match.group(1)
        do_something(result)

Если тег может охватывают несколько строк, вы можете попробовать загрузить весь файл в виде обычного текста в память, а затем просканировать его на предмет совпадений:

filedump = open("myfile.xml").read()
for match in re.finditer(r'<field\s+name="frame.len"\s+([^>]+)/>', filedump):
    result = match.group(1)
    do_something(result)

В обоих случаях результат будет содержать атрибуты, отличные от кадра .len . Регулярное выражение предполагает, что frame.len всегда является первым атрибутом внутри тега.

14
ответ дан 4 December 2019 в 13:01
поделиться

У вас нет - DOM API , несколько плохо спроектированный (w3c, а не Python! -), не имеет такой функции поиска, которая бы выполняла итерацию за вас. Либо согласитесь с необходимостью зацикливания (не через каждый тег в целом, а через все с заданным именем тега), либо перейдите на более расширенный интерфейс, например BeautifulSoup или lxml .

2
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: