Данный
<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" сразу же, не выполняя итерации через каждый тег и проверяя атрибуты?
Не думаю, что ты сможешь.
Из родительского элемента
вам необходимо
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
всегда является первым атрибутом внутри тега.
У вас нет - DOM API , несколько плохо спроектированный (w3c, а не Python! -), не имеет такой функции поиска, которая бы выполняла итерацию за вас. Либо согласитесь с необходимостью зацикливания (не через каждый тег в целом, а через все с заданным именем тега), либо перейдите на более расширенный интерфейс, например BeautifulSoup
или lxml
.