代码之家  ›  专栏  ›  技术社区  ›  xster

查找具有minidom属性的元素

  •  9
  • xster  · 技术社区  · 16 年前

    鉴于

    <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”字段?

    3 回复  |  直到 10 年前
        1
  •  13
  •   Tim Pietzcker    16 年前

    我觉得你做不到。

    从父级 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)
    

    如果A <场域; 标签 可以 跨越多行,您可以尝试将整个文件作为纯文本加载到内存中,然后扫描其匹配项:

    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 . 正则表达式假定 始终是标记内的第一个属性。

        2
  •  2
  •   Alex Martelli    16 年前

    你不知道 DOM API ,设计有点差(W3C,而不是python!-)没有这样的搜索函数来为您进行迭代。要么接受循环的需要(不是通过 每一个 一般来说是标记,但是通过使用给定的标记名),或者升级到更丰富的接口,例如 BeautifulSoup lxml .

        3
  •  0
  •   Rápli András    10 年前

    哇,那个雷鬼太可怕了!截至2016年, .getAttribute() 每种方法 DOMElement 这使得事情变得简单了一点,但是您仍然需要遍历元素。

    l = []
    for e in elements:
        if e.hasAttribute('name') and e.getAttribute('name') == 'field.len':
            l.append(e)