Listar elementos XML

Bom dia,
Estou com um sistema que utiliza minidom para achar por tags chaves no XML, estou precisando fazer o seguinte:
Tag2 está dentro da tag1.
E a tag2 também está dentro da tag3.

Listar todo o conteúdo que estão somente na tag2.

Não sei se o minidom tem suporte, mas já ouviu falar em xpath?

Não, sou novo em programação python e já olhei pelo google, porém ele só lista o primeiro elemento nessa tag, se tiver mais de 1 item com a mesma tag ele não lista o restante.

O xpath faz justamente o que você quer/precisa, pesquise alguma api com suporte a ela, como no post que mostrei há exemplos…

1 curtida

Segui os exemplos e não consegui fazer pois precisa de atributos na tag, e as tags não tem nenhum atributos, só outras tags filhas.
Teria como me informar se existe outra solução?

Você não é obrigado a usar atributos nas tags…

doc = etree.parse ( source )    
for c in doc.xpath ( "//raiz/tag1/tag3/tag2" ):
    ...

É como se você estive nagegando nas pastas do S.O. o conceito é parecido, vai testando as combinações uma hora a lista de tags aparece…

Aproveita para estudar mais sobre xpath, tem muita coisa legal…

https://www.w3schools.com/xml/xml_xpath.asp

Já que você está começando na programação, nunca se contente com exemplos apresentados, se aprofunde, busque outras alternativas, pesquisa faz parte da nossa profissão, bons estudos!

Nesse meu código, como ele seria adaptado para somente pela tag nDoc?

import xml.dom.minidom as minidom
import glob,os, sys

def main():
f = open(‘ctes.txt’,‘w’)
for file in glob.glob("*.xml"):
doc = minidom.parse(file)
if len(doc.getElementsByTagName(“nDoc”)) != 1:
f.write("")
else:
nquant = int(doc.getElementsByTagName(“nDoc”).length)
numerocte = doc.getElementsByTagName(“nCT”)[0]
numeroctelimpo = numerocte.firstChild.data
f.write(“Cte: “+numeroctelimpo+”\n”)
#f.write com os elementos que tem a tag nDoc
f.write("\n")
f.close()

main()

Tente isso e veja se retorna a lista que você quer…

lista = doc.getElementsByTagName("nDoc")

printf(lista)

Se sair a lista, para percorre-la acho que isso deve servir (não conheço a api minidom por isso estou supondo)…

for item in lista:
    print(item)

No print sai assim: DOM Element: nDoc at 0x2465b98
Como posso resolver?

Veja se resolve…

print(item.nodeValue)

E procure ler a documentação da API que está usando, o print mostrou o objeto e sua referência na memória, por se tratar de um objeto ele possui atributos e métodos, onde cada um traz/armazena algum tipo de dado… se esse conceito estiver dificil de aprender, nem adianta continuar no python sem pegar essa base, ainda mais trabalhando com xml que usa muito esses conceitos na prática…

Sugiro esse livro pra começar…

Apesar do titulo, ele pega do básico e vai aprofundando os conceitos, te dará uma boa base para prosseguir… bons estudos!