Гибкий вариант 3: чтение внешнего XML-файла — возникли некоторые проблемы

#xml #apache-flex #urlloader

#xml #apache-flex #urlloader

Вопрос:

Я перепробовал все примеры, которые смог найти, но ничего толком не сработало. Что я ищу для кода actionscript (без использования классов — я хотел бы выполнить весь код в разделе файла mxml) для загрузки в XML-файл, который хранится в том же расположении, что и swf-файл.

Мой XML настроен следующим образом:

 <?xml version="1.0" encoding="utf-8"?>
<projects>
    <project>
        <projName>project1</projName>
        <startDate>5/5/2011</startDate>
        <positions>
            <position>
                <startOffset>1</startOffset>
                <numDays>4</numDays>
                <role>1D</role>
                <student>Project 1 - Name 1</student>
            </position>
            ... repeat for however many position pieces there are
        </positions>
    </project>
    ... repeat for however many project pieces there are
</projects>
  

Я хочу прочитать это в виде простого XML (projectsXML для имени переменной), чтобы я мог сделать что-то вроде:

 <mx:Repeater id="singleProject" dataProvider="{projectsXML.projects.project}">
    <mx:Text id="projectName" text="{singleProject.currentItem.projName}" />
</mx:Repeater>
  

Что я на самом деле буду делать, так это вызывать компоненты внутри повторителя и передавать переменные, но если я смогу достичь вышеуказанного, я почти уверен, что смогу разобраться с остальным.

Если кто-нибудь может мне здесь помочь, я был бы очень признателен… итак, я могу перестать биться головой о стену : (

Заранее спасибо, Алекс

Ответ №1:

Попробуйте это и посмотрите, работает ли это…

 <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
     minWidth="955" minHeight="600"
        creationComplete="{projectsHttp.send()}" layout="vertical">
    <mx:HTTPService id="projectsHttp" url="projects.xml" />
    <mx:Repeater id="rpt" 
         dataProvider="{projectsHttp.lastResult.projects.project}" >
        <mx:Label text="{rpt.currentItem.projName}" />
    </mx:Repeater>
</mx:Application>
  

Комментарии:

1. когда я пытаюсь включить его в свой код, он не отображается при запуске приложения, у меня есть следующий код: <mx: Canvas width = «100%» height = «95%» x = «0» y = «80»> <mx: Repeater id = «PROJECTTRP» dataProvider=»{projectsHttp.lastResult.projects.project}»> <Block: project OneDay = «{usableSize.width/14}» Заголовок проекта =»{PROJECTTRP.CurrentItem.ProjectName}» projectDate=»{PROJECTTRP.CurrentItem.StartDate}» projectPositions=»{xmlListToArray(projectRP.CurrentItem.positions) в виде массива}» allStudents=»{allStudents}» projectsHttp=»{projectsHttp}» /> </mx: Repeater> </mx:Canvas>

2. Мне трудно разобраться, не зная подробностей о компоненте «project» в приведенном выше фрагменте кода. Также где находится холст по отношению к приложению. Извините , если я не стараюсь быть полезным . 1. у меня сразу возникает вопрос — вы вызываете send ()?

3. Я не совсем уверен, что я сделал, но у меня получилось… теперь я столкнулся с другой проблемой. В моем повторителе, где я вызываю компонент проекта, я передаю это: projectPositions=»{projectRP.CurrentItem.positions.position}»….. в компоненте проекта я объявляю projectPositions как объект. Правильно ли это? Мне нужно иметь возможность перемещаться по projectPositions и видеть каждый элемент в этом объекте.

Ответ №2:

Вы должны использовать HTTPService (или аналогичный метод) для загрузки XML-данных, а затем использовать результат для заполнения вашего списка после его загрузки.

Вот пример: http://blog.flexexamples.com/2008/03/29/dynamically-loading-xml-files-using-the-httpservice-tag /

Класс URLLoader также является опцией вместо HTTPService. Общий метод одинаков для обоих.