문제

기본적으로 변수를 사용하여 노드 이름과 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>&lt;non-escaped-content&gt;</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 ...


업데이트:나는 여기서 당신의 요점을 얻지 못합니다

"&lt;" a와 매우 다릅니다 "<"

그것이 모든 것이 무엇에 관한 것입니다 ... : D ... "<" 구문 분석 중에 해석 될 것입니다 "&lt;" 방금 다시 전환됩니다 "<", 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 + "]]>"));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top