Comment get une string particulière en XML en utilisant python ou perl etc

d'ici j'ai besoin d'get (nom d'user) "pelech" seul c'est juste exemple dans mon file xml j'ai 1000 users s'il vous plaît aidez-moi à résoudre ce problème.

<user> <login>pelech</login> <password>passwords are saved outside</password> </user> 

J'ai essayé le script suivant, mais cela ne fonctionne pas.

 import xml.etree.ElementTree as ET tree = ET.parse("users.xml") root = tree.getroot() for app in root.findall('user'): for l in zip(app.iter('login')): print("%s" % (app.get('login'))); ~ 

Si vous êtes sur Linux OS – solution simple xmlstarlet :

 xmlstarlet sel -t -v "//user/login" -n users.xml 

Je peux seulement supposer que votre XML est formaté de la même manière

 <users> <user> <login>pelech 1</login> <password>passwords are saved outside</password> </user> <user> <login>pelech 2</login> <password>passwords are saved outside</password> </user> 

Vous devez d'abord find votre identifiant de connection, puis vous devez saisir le text de cette label lors de son itération à l'intérieur de votre boucle.

 import xml.etree.ElementTree as ET tree = ET.parse("users.xml") root = tree.getroot() for app in root.findall('user'): for l in app.findall('login'): print("%s" % (l.text)); 

En utilisant ce XML comme exemple, cela fonctionne bien pour moi.

J'utilise beautifulsoup pour réaliser ceci

Si vous installez en utilisant pip, suivez les instructions suivantes

 pip install bs4 

Vous pouvez le tester en shell interactif python

 >>> from bs4 import BeautifulSoup as Soup >>> content = """<user> ... <login>pelech</login> ... <password>passwords are saved outside</password> ... </user>""" >>> soup = Soup(content, "html.parser") >>> soup.find_all("login") [<login>pelech</login>] >>> soup.find("login").text 'pelech' 

J'utilise le html.parser par défaut. Si vous avez des difficultés à l'parsingr correctement, vous pouvez envisager d'utiliser lxml à la place.

Pour des raisons de complétude, vous pouvez simplement parcourir la list renvoyée par soup.find_all("login")

 >>> for login in soup.find_all("login"): ... print(login.text) ... pelech 

Alternativement, la manière pythonique

 >>> usernames = [login.text for login in soup.find_all("login")] >>> usernames ['pelech'] 

Pour plus de détails, voir https://www.crummy.com/software/BeautifulSoup/bs4/doc/

Si votre file est garanti dans ce format avec le nom de connection à l'intérieur des balises dans une ligne distincte, vous n'avez pas besoin de bibliothèques xml et pouvez faire une simple

 sed -n 's_ *</*login>__gp' your.xml 

Cela supprime les balises et les espaces de début de cette ligne et imprime les rests (le nom d'user!), Tandis que toutes les autres lignes sont supprimées par l'option -n .

utiliser le module lxml

 <user> <login>pelech</login> <password>passwords are saved outside</password> </user> 

Le code suivant va extraire pelech du xml

 from lxml import etree document = etree.parse(open("users.xml")) user = etree.xpath("//login")[0].text #user will have value pelech 

En savoir plus sur xpath et lxml