2009-08-06 55 views
9

Về cơ bản tôi cần phải xác định tên nút và nội dung CDATA của nó bằng cách sử dụng các biến.E4X Thêm nội dung CDATA

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

ngây thơ Tôi nghĩ điều này sẽ làm việc:

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

Đầu ra:

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

Trong một phiên bản trước của kịch bản được thiết kế cho FP9 tôi bỏ qua vấn đề bằng cách sử dụng :

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

nhưng điều này dường như không hoạt động trong FP10 và tôi có cảm giác phương pháp này bằng cách nào đó đã bị giảm giá.

Bất kỳ ai là giải pháp thanh lịch cho điều này?

+0

trả lời cập nhật ... greetz – back2dos

Trả lời

6

thế nào về điều này:

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

kết quả đầu ra:

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

tôi thừa nhận, đây không phải là CDATA, nhưng tôi không thấy một vấn đề ... phân tích đòi hỏi một ít thời gian hơn, nhưng OTOH, hãy thoát đúng hơn nhiều so với CDATA ...

phiên bản với XMLNode sử dụng gói flash.xml, dành cho tương thích ngược với AS2 ... thậm chí còn không để ý, nó đã biến mất dưới FP10 ... tuy nhiên, bạn có thể sử dụng này

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

như một sự thay thế và sau đó sử dụng appendChild như bạn làm với flash.xml .. .

cách khác bạn có thể sử dụng nó phong cách E4X, nếu bạn bọc nó trong một hàm

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

và sau đó

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

nhưng cá nhân tôi, tôi nghĩ rằng chuỗi, mà cả hai đều dựa trên văn bản và tương đối ngắn, nên được thoát, chứ không phải sau đó được bọc trong CDATA ...


update: tôi không nhận được quan điểm của bạn đây

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

đó là những gì toàn bộ điều là về ...: D ... "<" sẽ được giải thích trong phân tích cú pháp, trong khi "&lt;" chỉ là r được chuyển đổi thành "<", vì vậy sau khi phân tích cú pháp XML, bạn sẽ có chính xác cùng một chuỗi như trước đây ...

đây là mã của tôi:

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

công trình hoàn hảo cho tôi trên flash player 10, biên soạn với sdk flex 4 ... không có một IDE đèn flash trong tầm tay, nhưng khi nói đến tinh khiết ActionScript kết quả gần như chắc chắn giống nhau, vì vậy nó sẽ hoạt động (bạn có thể sử dụng nó như lớp tài liệu của bạn, nếu bạn muốn, hoặc đơn giản là tạo ra nó) ...

btw. những dấu vết đầu tiên cho thấy, rằng ví dụ thứ hai hoạt động, đó cũng là khá rõ ràng, vì new XML(<String>) sử dụng có nguồn gốc XML phân tích cú pháp để tạo ra một XML từ chuỗi cho trước ...

đây là những gì tạo ra ở trên:

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

công trình khá tốt cho tôi ... :)


Greetz

lại 2dos

+0

Xin chào, cảm ơn. Lý do tại sao tôi muốn CDATA là phương pháp được sử dụng để đăng nhập chuỗi bao gồm XML, trong đó "<" rất khác với "<" tất nhiên ... Thật không may giải pháp thứ hai sẽ chuyển đổi thẻ của CDATA thành "< [CDATA []] > "bỏ qua toàn bộ biểu hiện của CDATA() :(Bạn có thực sự làm cho giải pháp thứ 3 hoạt động không? Điều này được sử dụng để hoạt động trong FP9 nhưng cho tôi lỗi thời gian chạy trong FP10? –

+0

Tôi không nhận được đĩa CData chức năng trợ giúp để biên dịch trong Flex SDK 3.X bất cứ điều gì – taudep

+0

@taudep: bạn đang gặp lỗi gì? – back2dos

7

Hàm cdata ở trên cần phải giống như sau, chú ý dấu ">" cuối cùng được thoát trong mã. Nếu không thì có lỗi biên dịch.

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

Phương pháp này hoạt động tốt cho mọi trường hợp, nhưng nếu tôi dữ liệu là ']]>' Tôi nhận được lỗi 'Đánh dấu trong tài liệu theo phần tử gốc phải được tạo đúng. "trong khi chuyển đổi thành xml. có cách nào khác để sửa nó không? –

2

Cảm ơn, chức năng cdata rất hữu ích. Tôi đã viết mới.

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+">"); 
} 

làm việc tốt :)

1

Dưới đây là một giải pháp

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

Đây là giải pháp của tôi mà không sử dụng các chức năng:

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

Nếu bạn cần phải thay thế nút hiện có nội dung và giữ nút attri butes bạn có thể sử dụng:

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 + "]]>")); 
Các vấn đề liên quan