给出
<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"/>
如何在不迭代每个标记并检查属性的情况下立即获取name =“frame.len”的字段?
答案 0 :(得分:14)
我认为你不能。
来自父element
,您需要
for subelement in element.GetElementsByTagName("field"):
if subelement.hasAttribute("frame.len"):
do_something()
从3月11日起对你的评论作出反应,如果你的文档结构稳定且没有令人讨厌的意外(如属性中的尖括号),你可能想尝试不可思议的并使用正则表达式。这不是推荐的做法,但可以比实际解析文件更容易。我承认我有时候也是这样做的。还没有失明。
因此,在您的情况下,您可以(假设<field>
标记不跨越多行):
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)
如果<field>
标记可以跨越多行,您可以尝试将整个文件作为纯文本加载到内存中,然后扫描它以查找匹配项:
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)
在这两种情况下,result
都将包含frame.len
以外的属性。正则表达式假定frame.len
始终是标记内的第一个属性。
答案 1 :(得分:2)
你没有 - DOM API,设计有点差(由w3c,而不是Python! - )没有这样的搜索功能来为你做迭代。要么接受循环的需要(不是通过每个标记,而是通过具有给定标记名称的所有标记),或者升级到更丰富的界面,例如BeautifulSoup
或{{1} }。
答案 2 :(得分:0)
.getAttribute()
都有一个DOMElement
方法,可以让事情变得更简单,但您仍然必须遍历这些元素。
l = []
for e in elements:
if e.hasAttribute('name') and e.getAttribute('name') == 'field.len':
l.append(e)