2 votes

Formatage des attributs de lxml ElementMaker

Merci à este question/réponse, j'ai pu faire ajouter un attribut namespace à un élément Root. J'ai donc maintenant ceci :

Code

from lxml.builder import ElementMaker

foo = 'http://www.foo.org/XMLSchema/bar'
xsi = 'http://www.w3.org/2001/XMLSchema-instance'
E = ElementMaker(namespace=foo, nsmap={'foo': foo, 'xsi': xsi})

fooroot = E.component()
fooroot.attrib['{{{pre}}}schemaLocation'.format(pre=xsi)] = 'http://www.foo.org/XMLSchema/bar http://www.foo.org/XMLSchema/barindex.xsd'
bars = E.bars(label='why?', validates='required')
fooroot.append(bars)
bars.append(E.bar(label='Image1'))
bars.append(E.bar(label='Image2'))

etree.dump(fooroot)

Cela me donne le résultat souhaité :

Sortie

<foo:component xmlns:foo="http://www.foo.org/XMLSchema/bar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.foo.org/XMLSchema/bar http://www.foo.org/XMLSchema/barindex.xsd">
  <foo:bars label="why?" validates="required">
    <foo:bar label="Image1"/>
    <foo:bar label="Image2"/>
  </foo:bars>
</foo:component>

La question

Pourquoi le fooroot.attrib['{{{pre}}}schemaLocation'.format(pre=xsi)] nécessite 3 attaches autour du pré ?

1 accolade : {pre} provoque une ValueError MAUVAIS
2 accolades : {{pre}} produit ns0:schemaLocation sur la sortie MAUVAIS
3 accolades : {{{pre}}} produit xsi:schemaLocation sur la sortie BON

Je comprends que .format usage pour la chaîne, mais j'aimerais comprendre pourquoi j'ai besoin de 3 accolades.

3voto

har07 Points 73742

Le format du nom de l'attribut de l'espacement des noms en lxml es {namespace-uri}local-name . Ainsi pour xsi:schemaLocation vous voulez essentiellement ajouter un attribut avec un nom :

'{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'

En {namespace-uri} peut être réalisée en utilisant format() et les triples accolades ouvrantes et fermantes qui peuvent être lues comme :

  • {{ : accolades ouvrantes échappées ; sorties littérales {
  • {pre} : placeholder ; sera remplacé par la valeur de la variable xsi comme spécifié dans .format(pre=xsi)
  • }} : accolades fermées échappées ; sorties littérales }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X