2009-08-06 13 views
9

Grundsätzlich muss ich einen Knotennamen und seinen CDATA-Inhalt mit Variablen definieren.E4X CDATA-Inhalt hinzufügen

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

Naiv dachte ich, das würde funktionieren:

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

Ausgänge:

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

In einer früheren Version des Skripts entworfen für FP9 umgangen ich das Problem durch die Verwendung :

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

aber das scheint nicht in FP10 zu arbeiten, und ich habe das Gefühl, die Methode ist irgendwie irgendwie abgeschrieben.

Wer ist eine elegante Lösung dafür?

+0

Antwort aktualisiert ... greetz – back2dos

Antwort

6

wie über dieses:

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

Ausgänge:

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

Ich gebe zu, das ist nicht CDATA, aber ich sehe nicht ein Problem ... Parsing ein wenig mehr Zeit erfordert, aber OTOH, korrektes Entkommen viel robuster als CDATA ...

die Version mit XMLNode verwendet das flash.xml Paket, das für Abwärtskompatibilität mit AS2 ... nicht einmal bemerkt haben, wurde es ... aber unter FP10 gegangen, können Sie diese

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

als Ersatz verwenden könnte und appendChild dann verwenden, wie Sie es mit flash.xml .. wenn Sie es in einer Funktion

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

und dann

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

alternativ könnte man es e4x Stil verwenden,

aber persönlich, ich glaube, dass Strings, die sowohl basierter Text sind und relativ kurz, eher in CDATA ...


Update dann gewickelt entwertet werden soll: i nicht bekommen, Ihren Punkt hier

"&lt;" is very different than a "<"

, das ist es, was die ganze Sache über ... ist: D ... "<" würde beim Parsen interpretiert werden, während "&lt;" gerade ist r econverted zu "<", also nach der Analyse der XML, haben Sie genau die gleiche Schnur wie vorher ...

dies ist mein 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 + "]]>"); 
     } 
    } 
} 

Werke für mich perfekt auf Flash Player 10, mit Flex SDK 4 zusammengestellt ... kein Flash-IDE zur Hand haben, aber wenn es um die reine Actionscript Ergebnisse sind fast auf jeden Fall die gleiche, so sollte es funktionieren (Sie, dass als Dokumentenklasse verwenden können, wenn Sie wollen, oder es einfach instanziiert) ...

btw. die erste Spur zeigt, dass das zweite Beispiel funktioniert, die auch ganz offensichtlich, da new XML(<String>) die native XML Parser verwendet eine XML aus dem gegebenen String ...

hier ist das, was die oben erzeugt zu erstellen:

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

funktioniert bei mir ganz gut ... :)


greetz

zurück 2dos

+0

Hey, danke. Der Grund, warum ich CDATA will, ist, dass die Methode Strings einschließlich XML zur Anmeldung verwendet wird, in dem ein „<“ ist ganz anders als eine „<“ natürlich ... Leider die zweite Lösung wird die Tags des CDATA konvertieren "< [CDATA []] > "die ganze Bedeutung des CDATA ignorieren() :(Haben Sie eigentlich die dritte Lösung funktioniert? Dies war früher in FP9 arbeiten, aber gibt mir einen Laufzeitfehler in FP10? –

+0

ich bin nicht die cdata bekommen Hilfsfunktion in Flex SDK 3.X etwas kompilieren – taudep

+0

@taudep: Welche Fehler sind Sie immer – back2dos

7

Die obige cdata Funktion muss wie die folgenden sehen, die letzte NOTICE „>“ im Code entkommen. Ansonsten gibt es Kompilierungsfehler.

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

diese Methode funktioniert gut für alle Fälle, aber was ist, wenn mein Daten sind ']]>' Ich erhalte Fehler "Das Markup im Dokument, das dem Wurzelelement folgt, muss wohlgeformt sein." beim Konvertieren in XML. Gibt es eine andere Möglichkeit, es zu beheben? –

2

Danke, cdata Funktion ist sehr nützlich. Ich habe nur ein neues geschrieben.

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

funktionieren :)

1

Hier ist eine andere Lösung

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()); 
} 
1

Hier ist meine Lösung ohne Verwendung von Funktionen:

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

Wenn Sie vorhandene Knoten ersetzen Inhalt und halten Knotenattribut Sie können verwenden:

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 + "]]>")); 
Verwandte Themen