Gestion des données xml d'un fichier .svg
Résolu/Fermémamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 5 déc. 2023 à 16:02
- Gestion des données xml d'un fichier .svg
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Fichier host - Guide
4 réponses
1 déc. 2023 à 15:29
Bonjour,
Voici un code simplifié qui devrait répondre à ta question
import pandas as pd import xml.etree.ElementTree as ET from pprint import pprint svg = """<?xml version="1.0"?> <xml> <text transform="matrix(1 0 0 1 983.5477 127.215)" class="st1 st2">190</text> <text transform="matrix(1 0 0 1 983.5477 83.7648)" class="st1 st2">110</text> <text transform="matrix(1 0 0 1 863.1507 21.9888)" class="st1 st2">150</text> <text transform="matrix(1 0 0 1 422.2171 527.5231)" class="st1 st2">160</text> <text transform="matrix(1 0 0 1 290.4154 509.5524)" class="st1 st2">200</text> </xml>""" tree = ET.ElementTree(ET.fromstring(svg)) records = list() for node in tree.findall(".//text"): if "transform" in node.attrib: matrix = node.attrib["transform"] i = matrix.index("(") + 1 j = matrix.index(")") record = [float(x) for x in matrix[i: j].split()] k = int(node.text) record.append(k) records.append(record) pprint(records) df = pd.DataFrame(records) df
Résultat :
[[1.0, 0.0, 0.0, 1.0, 983.5477, 127.215, 190],
[1.0, 0.0, 0.0, 1.0, 983.5477, 83.7648, 110],
[1.0, 0.0, 0.0, 1.0, 863.1507, 21.9888, 150],
[1.0, 0.0, 0.0, 1.0, 422.2171, 527.5231, 160],
[1.0, 0.0, 0.0, 1.0, 290.4154, 509.5524, 200]]
Bonne chance
Modifié le 28 nov. 2023 à 03:01
bonjour,
suggestion:
from lxml import etree # Indiquer le chemin ou trouver les infos # lxml permet de naviguer et analyser(parse) un XML tree = etree.parse("test.svg") # Définir le namespace, le langage (XML) # du SVG pour s'y retrouver ns = {"svg": "http://www.w3.org/2000/svg"} for lg in tree.findall(".//svg:text", ns): if "transform" in lg.attrib: attr = lg.attrib["transform"] print(lg.text, attr)
Modifié le 27 nov. 2023 à 11:21
Bonjour
merci ca fonctionne, je n'avais pas pensé à faire
print(lg.text,....) certainement mon manque de logique et expérience avec Python.
Concernant le transfert de certaines de ses valeurs dans un fichier xls, quelle méthode vous me suggérez?
Peut être passer de XML en CSV puis en XLS ? d'après ce que j'ai lu sur internet
cordialement
27 nov. 2023 à 13:00
Il est en effet très simple de créer un fichier CSV.
27 nov. 2023 à 14:54
Si tu utilises pandas, tu ne devrais pas avoir de difficulté à générer directement tes fichiers excel sans faire d'étape par un csv, mais plutôt par une pandas.DataFrame. Voir ici. Au lieu de faire des print, il faudra simplement peupler ta DataFrame.
Modifié le 28 nov. 2023 à 03:02
Merci j'ai crée mon dataframe, mais je n'ai qu'une valeur prise en compte "matrix(1 0 0 1 686.7148 73.5248) 180". Je voudrais toute la liste de (lg.text,attr) de mon XML.
Des conseils? Pas de solution, une méthode à appliquer, s'il vous plaît.
Merci
for lg in tree.findall("//svg:text", ns): if 'transform' in lg.attrib: attr = lg.attrib['transform'] print(lg.text, attr) df = pd.DataFrame([lg.text], [attr]) print(df) df.columns = ["X"] df.to_excel("hotspot.xlsx", sheet_name="hotspot", index=False)
27 nov. 2023 à 22:29
La méthode à appliquer implique de travailler dans la boucle.
Modifié le 30 nov. 2023 à 16:33
Dans un premier temps, je cherche à imprimer ma liste de valeur dans excel. Pour instant, je n'y arrive pas, je n'ai toujours qu'une seule valeur,
Je m'occuperais après de les stocker suivant N tuples de 7 éléments.
- Quelles sont mes erreurs?
- Avez-vous un exemple exercice avec les tuples que je pourrais utiliser pour ma situation sur internet ?
Merci
for lg in tree.findall("//svg:text", ns): if "transform" in lg.attrib: attr = lg.attrib["transform"] '''print(lg.text, attr)''' liste_HS = [(lg.text, attr)] for HS in liste_HS: '''print(HS)''' df = pd.DataFrame(liste_HS) print(df) df.columns = ["A", "B"] df.to_excel( "hotspot.xlsx", sheet_name="hotspot", index=False )
Modifié le 30 nov. 2023 à 16:36
J'ai réussi pour les trois colonnes :
print(liste_HS) liste_HS1 = [( liste_HS[0], liste_HS[1][15:22], liste_HS[1][24:31] )] print(liste_HS1) df = pd.DataFrame(liste_HS1) print(df) df.columns = ["item", "X", "Y"] df.to_excel( "hotspot.xlsx", sheet_name='hotspot', index=False )
Résultat :
0 1 2
0 180 686.714 73.5248
4 déc. 2023 à 17:42
Bonjour
Merci mamiemando!! j'ai juste changé "i = matrix.index("(") + 8"
comme çà je conserve uniquement les 3 valeurs qui m'intéresse
5 déc. 2023 à 16:02
De rien :-) Pense à basculer ton sujet en résolu la prochaine fois.
Bonne continuation