Encontrar elemento con atributo con minidom

Dado

        

¿Cómo obtengo el campo con name = “frame.len” de inmediato sin iterar a través de cada etiqueta y verificar los atributos?

No creo que puedas.

Desde el element padre, necesita

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

Reaccionando a su comentario del 11 de marzo, si la estructura de sus documentos es estable y está libre de sorpresas desagradables (como paréntesis de ángulo dentro de los atributos), puede intentar lo impensable y usar una expresión regular. Esta no es una práctica recomendada, pero podría funcionar y ser mucho más fácil que analizar el archivo. Admito que a veces lo he hecho yo mismo. Todavía no me he quedado ciego.

Entonces, en su caso, podría (suponiendo que una etiqueta no abarca varias líneas):

 xmlfile = open("myfile.xml") for line in xmlfile: match = re.search(r']+)/>', line): if match: result = match.group(1) do_something(result) 

Si una etiqueta puede abarcar varias líneas, puede intentar cargar todo el archivo como texto sin formato en la memoria y luego escanearlo para buscar coincidencias:

 filedump = open("myfile.xml").read() for match in re.finditer(r']+)/>', filedump): result = match.group(1) do_something(result) 

En ambos casos, el result contendrá los atributos que no sean frame.len . La expresión regular asume que frame.len es siempre el primer atributo dentro de la etiqueta.

Usted no: la API DOM , un poco mal diseñada (por w3c, no por Python! -) no tiene una función de búsqueda para hacer la iteración por usted. Acepte la necesidad de realizar un bucle (no en todas las tags en general, sino en todas con un nombre de etiqueta determinado), o actualice a una interfaz más rica, como BeautifulSoup o lxml .

Wow, ese regex es horrible! A partir de 2016, hay un método .getAttribute() para cada elemento de DOMElement que hace las cosas un poco más fáciles, pero aún tiene que recorrer los elementos.

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