Question

En fait, je dois définir un nom de noeud et son contenu CDATA en utilisant des variables.

var nodeName:String = "tag";
var nodeValue:String = "<non-escaped-content>";

Naïvement je pensais que cela fonctionnerait:

var xml:XML = <doc><{nodeName}><![CDATA[{nodeValue}]]></{nodeName}>

Sorties:

<doc><tag><![CDATA[{nodeValue}]]></tag></doc>

Dans une version précédente du script conçu pour FP9 je contourné le problème en utilisant:

new XMLNode( XMLNodeType.XMLNodeType.CDATA_NODE, nodeValue ); // ...

mais cela ne semble pas fonctionner en FP10, et j'ai le sentiment que la méthode est en quelque sorte dépréciée de toute façon.

Toute une solution élégante pour cela?

Était-ce utile?

La solution

Que diriez-vous ceci:

var xml:XML = <doc><{nodeName}>{nodeValue}</{nodeName}></doc>
trace(xml.toXMLString());

sorties:

<doc>
  <tag>&lt;non-escaped-content&gt;</tag>
</doc>

je l'avoue, ce n'est pas CDATA, mais je ne vois pas un problème ... l'analyse syntaxique nécessite un peu plus de temps, mais OTOH, correct échapper beaucoup plus robuste que CDATA ...

la version avec XMLNode utilise le package flash.xml, qui est pour la compatibilité ascendante avec AS2 ... n'a même pas remarqué, il avait disparu sous FP10 ... Cependant, vous pouvez utiliser cette

var x:XML = new XML("<![CDATA[" + nodeValue + "]]>");

en remplacement et ensuite utiliser appendChild comme vous le feriez avec flash.xml ...

Sinon, vous pouvez l'utiliser le style e4x, si vous l'envelopper dans une fonction

function cdata(data:String):XML {
    return = new XML("<![CDATA[" + data + "]]>");
}

et

var xml:XML = <doc><{nodeName}>{cdata(nodeValue)}</{nodeName}></doc>

mais personnellement, je pense que les chaînes, qui sont à la fois mode texte et relativement court, devraient être échappés, plutôt enveloppé dans CDATA ...


Mise à jour: Je ne comprends pas votre point ici

  

"&lt;" est très différent d'un "<"

est ce que toute la chose est sur ...: serait interprété D ... "<" lors de l'analyse syntaxique, alors que "&lt;" est juste reconverti en "<", donc après l'analyse syntaxique du XML, vous aurez < strong> exactement la même chaîne que précédemment ...

est mon code:

package {
    import flash.display.MovieClip;
    public class Main extends MovieClip {       
        public function Main():void {
            var nodeName:String = "tag";
            var nodeValue:String = "<non-escaped-content>";
            var xml:XML = <doc><{nodeName}>{cdata(nodeValue)}</{nodeName}></doc>;
            trace(cdata("test").toXMLString());
            trace(xml.toXMLString());
        }
        private function cdata(data:String):XML {
            return new XML("<![CDATA[" + data + "]]>");
        }
    }
}

fonctionne parfaitement pour moi sur le lecteur flash 10, compilé avec sdk flex 4 ... ne dispose pas d'un IDE flash à portée de main, mais quand il vient aux résultats purs ActionScript sont presque certainement le même, il doit donc travailler (vous peut l'utiliser comme classe de document, si vous voulez, ou tout simplement instancier) ...

BTW. la première trace montre que le second exemple fonctionne, ce qui est tout à fait évident, puisque new XML(<String>) utilise l'analyseur XML natif pour créer une XML de la chaîne donnée ...

Voici ce que le génère ci-dessus:

<![CDATA[test]]>
<doc>
  <tag><![CDATA[<non-escaped-content>]]></tag>
</doc>

fonctionne très bien pour moi ...:)


greetz

back2dos

Autres conseils

La fonction CDATA ci-dessus doit ressembler à ce qui suit, notez le dernier « > » se réfugiera dans le code. Dans le cas contraire, il y a des erreurs de compilation.

private function cdata(data:String):XML
{
    return new XML("<![CDATA[" + data + "]]\>");                
}

Merci, la fonction CDATA est très utile. J'ai écrit tout nouveau.

function newNode(nodeName:String,nodeValue:String):XML{
    return new XML(<{nodeName}>{cdata(nodeValue)}</{nodeName}>);
}
private function cdata(data:String, nodeName:String):XML{
    return new XML( "<"+nodeName+"><![CDATA[" + data + "]]\></"+nodeName+">");
}

beau travail:)

Voici une autre solution

public static function getCDATANode(data:String, tagName:String):void
{
        var node:XML  = new XML(  "<" + tagName + "/>" );
        var cdata:XML = new XML("<![CDATA[" + data + " ]]>");
        node.appendChild(cdata);

        trace("getCDATANode: ", node.toXMLString() );
}

Voici ma solution sans utiliser les fonctions:

var nodeName:String = "tag";
var nodeValue:String = "<non-escaped-content>";
var xml:XML = <doc><{nodeName}>{new XML("<![CDATA[" + nodeValue + "]]>")}</{nodeName}></doc>;

Si vous devez remplacer le contenu des noeuds existants et garder nœud attributs que vous pouvez utiliser:

var newNodeValue:String = "<non-escaped-content>";
var xml:XML = <doc><tag attribute="true">This is node content</tag></doc>;

xml.tag[0].setChildren(new XMLList());
xml.tag[0].appendChild(new XML("<![CDATA[" + newNodeValue + "]]>"));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top