1
votes

Existe-t-il un moyen de passer des paramètres à un XML? Ou le modifier?

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 & param1 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: titre inventé au lieu de moon .

Edit: ajouté ceci à ma recherche


0 commentaires

4 Réponses :


-1
votes

Utilisez la balise pour passer un paramètre en xml


1 commentaires

pourrait être cette aide:



2
votes

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)


1 commentaires

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!!



1
votes

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.


0 commentaires

1
votes

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)


0 commentaires