簡體   English   中英

在Flex / AS3中以字符串形式讀取xml中的xml

[英]Reading xml within xml as String in flex/AS3

我收到的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>

我可以用event.result.data1讀取<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>

首先,我看到您的XML有兩個問題。 這是無效的,並且您沒有收到錯誤,這令人感到驚訝。

1)沒有根節點。 一個簡單的解決方法是將您已有的標簽放入標簽中或更有意義的地方。 但是您需要有一個根節點。

2)以數字開頭的節點名稱不是一個好主意。 不確定根據XML規范是否有效,但是即使有效,它也不是有效的動作腳本。 在這種情況下,您將必須避免使用點(而不是data1.3c ,類似data1["3c"] 。通常,像命名變量一樣命名節點,這樣就可以了。

如果<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方法以字符串形式獲取節點的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM