在flex / AS3中将xml中的xml读取为String

时间:2010-06-16 01:59:35

标签: xml flex actionscript-3

我正在获得看起来像这样的XML输入

<?xml version="1.0" encoding="utf-8"?>
<data1>this is data 1</data1>
<data2>this is data 2</data2>
<data3>
      <3a>this is data 3a</3a>
      <3b>this is data 3b</3b>
      <3c>
            <TextFlow xmlns="http://ns.adobe.com/textLayout/2008">
                    <p direction="ltr" >
                           <span>some text</span>
                           <span>some additional text</span>
                    </p>
                    <p direction="ltr">
                           <span>some text</span>
                           <span>some additional text</span>
                    </p>
             </TextFlow>
       </3c>
</data3>

我可以使用<data1>阅读event.result.data1,其中输出字符串this is data1

但是当我对event.result.data3.3c做同样的事情时,会打印object [object],所以我猜它正试图深入挖掘树。但我需要从<TextFlow></TextFlow>开始并包含的实际字符串文本(不是xml树)作为字符串存储和打印。不知道这是什么语法?

我正在寻找的字符串如下所示:

        <TextFlow xmlns="http://ns.adobe.com/textLayout/2008">
                <p direction="ltr" >
                       <span>some text</span>
                       <span>some additional text</span>
                </p>
                <p direction="ltr">
                       <span>some text</span>
                       <span>some additional text</span>
                </p>
         </TextFlow>

1 个答案:

答案 0 :(得分:3)

首先,我发现您的XML存在一些问题。这是无效的,你不会收到错误,这有点令人惊讶。

1)没有根节点。一个简单的解决方法是将您已有的东西放在标签中或更有意义的东西上。但是你需要有一个根节点。

2)以数字开头的节点名称是个坏主意。根据XML规范不确定它是否有效,但即使它是,它也不是有效的actionscript。在这种情况下,您将不得不避免使用点(而不是data1.3c,例如data1["3c"]。一般来说,命名您的节点就像命名变量一样,你会没事的。< / p>

如果<TextFlow>中的数据是一个字符串,并且您对解析它不感兴趣,或许更好的想法是将它包装在CDATA部分中:

<c3><![CDATA[<TextFlow xmlns="http://ns.adobe.com/textLayout/2008">
    <p direction="ltr" >
           <span>some text</span>
           <span>some additional text</span>
    </p>
    <p direction="ltr">
           <span>some text</span>
           <span>some additional text</span>
    </p>
</TextFlow>]]></c3>

否则,您应该使用xml命名空间来处理它(注意<TextFlow>节点有xmlns声明; xmlns代表XML命名空间。

你可以尝试这样的东西来抓住它:

var layout_ns:Namespace = new Namespace("http://ns.adobe.com/textLayout/2008");
trace(your_xml.data3.c3.layout_ns::TextFlow);

注意TextFlow以正确的命名空间为前缀。

上述代码的替代方法是设置默认命名空间:

var layout_ns:Namespace = new Namespace("http://ns.adobe.com/textLayout/2008");
default xml namespace = layout_ns;
trace(your_xml.data3.c3.TextFlow);

但是,这种方式首先打败了拥有名称空间的目的。

<强> PS

如果你使用第二个选项(即没有CDATA),一旦你到达你想要的节点,你可以使用toXMLString方法将节点的内容作为字符串。