Je voudrais passer un certain paramètre à un xml, donc au lieu d'être un xml brut avec toutes les valeurs par la création de celui-ci, j'aimerais en changer un avec un paramètre (une entrée utilisateur, par exemple) .
Idéalement, je cherchais quelque chose comme
et être capable plus tard de passer le paramètre que je voudrais, mais je suppose que cela ne peut pas être fait.
Donc, comme le passage d'un paramètre ne peut pas être fait (ou du moins à partir de ce que j'ai recherché), j'ai pensé à éditer le xml après sa création.
J'ai surtout cherché avec beautifulsoup, car c'est ce que je veux utiliser (et ce que j'utilise). Ce n'est qu'une petite partie de mon projet. par exemple ceci et ce sont quelques-unes de mes recherches).
Voici donc la fonction que j'essaye de faire:
Nous avons un xml, nous trouvons la partie que nous voulons éditer, et nous la modifions (je sais que pour y accéder, il doit être un entier pruebaEdit [anyString]
n'est pas correct. P >
def editXMLTest(): editTest="""<?xml version="1.0" ?> <books> <book> <title>moon</title> <author>louis</author> <price>8.50</price> </book> </books> """ soup =BeautifulSoup(editTest) for tag in soup.find_all('title'): print (tag.string, '\n') #tag.string='invented title' editTest[tag]='invented title' #I know it has to be an integer, not a string print() print(editTest)
Ma sortie attendue doit être au format xml:
au lieu de
.
Edit: ajouté ceci à ma recherche
4 Réponses :
Utilisez la balise
pour passer un paramètre en xml
pourrait être cette aide:
vous devez imprimer les résultats ou soupe
chaîne non originale editTest
for tag in soup.find_all('title'): print (tag.string, '\n') tag.string='invented title' print(soup)
Merci ... C'était assez stupide. J'ai essayé de le faire avec cleanSoup = BeautifulSoup (str (soupe) .replace ('moon', valueToChange))
Mais cela fonctionne beaucoup mieux, dommage que je ne l'ai pas imprimé correctement. Merci!!
L'utilisation de références d'entité comme & param;
est la chose la plus proche disponible dans XML lui-même, mais ce n'est pas très flexible car les extensions d'entités sont définies dans un fichier DTD plutôt que d'être fournies par programme à l'analyseur XML. Certains analyseurs (je ne connais pas la situation Python) vous permettent de fournir un EntityResolver qui peut résoudre les références d'entités par programme, mais ce ne serait pas mon premier choix d'approche.
Il existe bien sûr des langages de création de modèles qui permettent de construire XML par programmation. XSLT est le choix le plus évident; il fait probablement beaucoup plus que ce dont vous avez besoin, mais ce n'est pas nécessairement un inconvénient. D'autres options sont répertoriées sur https://en.wikipedia.org/wiki/Comparison_of_web_template_engines - - dont une poignée pour l'environnement Python. Malheureusement, beaucoup de ces outils, d'après mon expérience, ne sont pas particulièrement bien documentés ou pris en charge, alors faites vos recherches avec soin.
Avec lxml
de Python qui peut exécuter des scripts XSLT 1.0 et également le moteur d'analyse à BeautifulSoup
, vous pouvez passer des paramètres pour modifier les fichiers XML comme avait besoin. Définissez simplement le dans le script XSLT et dans la valeur de passe Python via
strparam
:
XSLT (enregistrer sous fichier .xsl, un fichier .xml spécial)
import lxml.etree as et txt = '''<books> <book> <title>moon</title> <author>louis</author> <price>8.50</price> </book> </books>''' # LOAD XSL SCRIPT xml = et.fromstring(txt) xsl = et.parse('/path/to/XSLTScript.xsl') transform = et.XSLT(xsl) # PASS PARAMETER TO XSLT n = et.XSLT.strparam('invented title') result = transform(doc, new_title=n) print(result) # <?xml version="1.0"?> # <books> # <book> # <title>invented title</title> # <author>louis</author> # <price>8.50</price> # </book> # </books> # SAVE XML TO FILE with open('Output.xml', 'wb') as f: f.write(result)
Python (voir la sortie ci-dessous en commentaire) em >
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" omit_xml_declaration="no"/> <xsl:strip-space elements="*"/> <!-- INITIALIZE PARAMETER --> <xsl:param name="new_title" /> <!-- IDENTITY TRANSFORM --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- REWRITE TITLE TEXT --> <xsl:template match="title"> <xsl:copy> <xsl:value-of select="$new_title"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Démo Pyfiddle (assurez-vous de cliquer sur exécuter et vérifier la sortie)