Чтение xml в xml как String в flex / AS3 - PullRequest
1 голос
/ 16 июня 2010

Я получаю 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], так что я думаю, что он пытается копнуть глубже в дерево.Но мне нужно, чтобы фактический текст строки (а не дерево xml), начиная с <TextFlow></TextFlow>, был сохранен и напечатан в виде строки.Любая идея, что синтаксис для этого?

Строка, которую я ищу, будет выглядеть так:

        <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 Ответ

3 голосов
/ 16 июня 2010

Во-первых, я вижу пару проблем с вашим 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 , чтобы получить содержимоеузел в виде строки.

...