2009-04-14 9 views
0

je dois avoir valeur d'attribut suivante dans mon noeud XML:Comment écrire l'esperluette dans un nœud attribué?

CommandLine="copy $(TargetPath) ..\..\
echo dummy > dummy.txt" 

En fait, cela fait partie d'un fichier .vcproj généré en VS2008. 
&#x0A signifie saut de ligne, car il devrait y avoir 2 commandes séparées. J'utilise Python 2.5 avec minidom pour analyser XML - mais malheureusement, je ne sais pas comment stocker des séquences comme 
, la meilleure chose que je peux obtenir est &amp#x0D;.

Comment puis-je stocker exactement 
?

UPD: Je parle exactement dois pas stocker &, mais \ r séquence \ n sous forme de & # x0A

+0

& # x0D; (par exemple pxdom.) (Vous avez oublié le point-virgule après l'ampli) – bortzmeyer

+0

@easyeurope: Pour l'instant, vous pouvez enchaîner les commandes avec l'opérateur & dans cmd.exe, comme ceci: "copy $ (TargetPath) .. \ .. \ & echo dummy> dummy.txt ". Peut-être que cela aide. – Tomalak

Répondre

1

J'utilise Python 2.5 avec minidom pour analyser XML - mais malheureusement, je ne sais pas comment stocker des séquences comme

Eh bien, vous ne pouvez pas spécifier que vous voulez hex échappe spécifiquement , mais selon la norme DOM LS, les implémentations doivent changer automatiquement les valeurs d'attribut en références de caractères.

Malheureusement, minidom ne:

>>> from xml.dom import minidom 
>>> document= minidom.parseString('<a/>') 
>>> document.documentElement.setAttribute('a', 'a\r\nb') 
>>> document.toxml() 
u'<?xml version="1.0" ?><a a="a\r\nb"/>' 

Ce bogue dans minidom. Essayez la même chose dans un autre DOM:

>>> import pxdom 
>>> document= pxdom.parseString('<a/>') 
>>> document.documentElement.setAttribute('a', 'a\r\nb') 
>>> document.pxdomContent 
u'<?xml version="1.0" ?><a a="a&#13;&#10;b"/>' 
+1

J'ai déposé un rapport de bug ici: http://bugs.python.org/issue5752. Peut-être qu'ils font quelque chose à ce sujet. – Tomalak

+0

merci, une demi-journée passée pour une si petite chose) – user68416

1

Vous devriez essayer stocker dans la valeur d'attribut des caractères réels (ASCII 13 et ASCII 10) , au lieu de leurs homologues déjà échappés.


EDIT: Il semble que minidom ne gère pas correctement les retours à la ligne dans les valeurs d'attribut.

Même si un saut de ligne littéral dans une valeur d'attribut est autorisé, il sera confronté à une normalisation lors de l'analyse du document, moment auquel il est converti en espace.

J'ai déposé un bug à cet égard: http://bugs.python.org/issue5752

+0

je devrais avoir mon échappement sequense en sortie - c'est exactement ce que VS2008 fait. – user68416

+0

Le DOM s'occupera de l'échappement des caractères selon les règles XML. Ne vous embêtez pas sur les séquences d'échappement, il suffit de stocker les * données * que vous souhaitez stocker. – Tomalak

+0

Je comprends que DOM se soucie de s'échapper. Mais comment dire au DOM que je veux stocker \ r \ n séquence dans le style d'échappement ? – user68416

0

Un esperluette est un caractère spécial en XML et en tant que tel la plupart des parseurs XML exigent xml valide pour fonctionner. Laissez minidom échapper l'esperluette pour vous (en fait, il devrait déjà être échappé) et ensuite, lorsque vous avez besoin d'afficher la valeur échappée, effacez-la.

+0

Exatly speking je dois stocker pas &, mais \ r \ n séquence sous la forme de & # x0A – user68416

+0

Droit, alors convertir & à & quand vous avez besoin de votre & # x0A pour regarder de cette façon. "&". join (myValue.split ("&")); –

+0

qui ne fonctionne pas. dom stocke tous les symboles & & amp automatiquement comme – user68416

Questions connexes