E4X CDATA 컨텐츠를 추가하십시오
-
11-09-2019 - |
문제
기본적으로 변수를 사용하여 노드 이름과 CDATA 컨텐츠를 정의해야합니다.
var nodeName:String = "tag";
var nodeValue:String = "<non-escaped-content>";
순진하게 나는 이것이 효과가 있다고 생각했다 :
var xml:XML = <doc><{nodeName}><![CDATA[{nodeValue}]]></{nodeName}>
출력 :
<doc><tag><![CDATA[{nodeValue}]]></tag></doc>
FP9 용으로 설계된 스크립트의 이전 버전에서 다음을 사용하여 문제를 우회했습니다.
new XMLNode( XMLNodeType.XMLNodeType.CDATA_NODE, nodeValue ); // ...
그러나 이것은 FP10에서 작동하지 않는 것 같습니다. 어쨌든 방법이 어떻게 든 감가 상각된다는 느낌이 들었습니다.
이것에 대한 우아한 솔루션이 있습니까?
해결책
이건 어때:
var xml:XML = <doc><{nodeName}>{nodeValue}</{nodeName}></doc>
trace(xml.toXMLString());
출력 :
<doc>
<tag><non-escaped-content></tag>
</doc>
나는 이건 아니에요 CDATA
, 그러나 나는 문제가 보이지 않습니다 ... 구문 분석은 조금 더 시간이 필요하지만, Otoh는 CDATA
...
버전 XMLNode
사용 flash.xml
AS2와의 거꾸로 호환성을위한 패키지는 ... 눈치 채지 못했습니다. FP10에 따라 사라졌습니다 ... 그러나 이것을 사용할 수 있습니다.
var x:XML = new XML("<![CDATA[" + nodeValue + "]]>");
교체 한 다음 사용하십시오 appendChild
Flash.xml과 마찬가지로 ...
또는 기능으로 래핑하면 e4x 스타일을 사용할 수 있습니다.
function cdata(data:String):XML {
return = new XML("<![CDATA[" + data + "]]>");
}
그리고
var xml:XML = <doc><{nodeName}>{cdata(nodeValue)}</{nodeName}></doc>
그러나 개인적으로, 나는 텍스트를 기반으로하고 상대적으로 짧은 현이 피해야한다고 생각합니다. CDATA
...
업데이트:나는 여기서 당신의 요점을 얻지 못합니다
"<"
a와 매우 다릅니다"<"
그것이 모든 것이 무엇에 관한 것입니다 ... : D ... "<"
구문 분석 중에 해석 될 것입니다 "<"
방금 다시 전환됩니다 "<"
, XML을 구문 분석 한 후에는 바로 그거죠 이전과 같은 문자열 ...
이것은 내 코드입니다.
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 + "]]>");
}
}
}
Flash Player 10에서 FLANT SDK 4로 컴파일 한 Flash Player 10에서 완벽하게 작동합니다. Flash IDE가 없지만 Pure ActionScript 결과와 관련하여 거의 동일하므로 작동해야합니다 (사용할 수 있습니다. 문서 수업으로, 원한다면 단순히 인스턴스화하는 경우) ...
BTW. 첫 번째 흔적은 두 번째 예제가 효과가 있음을 보여줍니다. new XML(<String>)
네이티브를 사용합니다 XML
파서를 만들려면 XML
주어진 문자열에서 ...
위의 내용은 다음과 같습니다.
<![CDATA[test]]>
<doc>
<tag><![CDATA[<non-escaped-content>]]></tag>
</doc>
나에게 아주 잘 작동합니다 ... :)
인사
back2dos
다른 팁
위의 CDATA 함수는 다음과 같아야합니다. 마지막 ">"이 코드에서 피해요. 그렇지 않으면 컴파일 오류가 있습니다.
private function cdata(data:String):XML
{
return new XML("<![CDATA[" + data + "]]\>");
}
감사합니다. CDATA 기능은 매우 유용합니다. 나는 단지 새로운 것을 썼다.
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+">");
}
잘 작동합니다 :)
다음은 또 다른 해결책입니다
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() );
}
기능을 사용하지 않고 내 솔루션은 다음과 같습니다.
var nodeName:String = "tag";
var nodeValue:String = "<non-escaped-content>";
var xml:XML = <doc><{nodeName}>{new XML("<![CDATA[" + nodeValue + "]]>")}</{nodeName}></doc>;
기존 노드 컨텐츠를 교체하고 노드 속성을 유지 해야하는 경우 사용할 수 있습니다.
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 + "]]>"));