PDA

Просмотр полной версии : Отслеживание Tree => XML


swat05
24.08.2008, 13:41
Опять вопрос по дереву. В лайв доках ответа не нашол. Одним словом надо узнать какой узел сейчас просматривается в ХМЛ переменной используемой в дереве. Обьяснил ужасно. допустим пользователь выделил в дереве какой то узел. через nodeValue изменил его содержимое - myTree.selectedNode.nodeValue = editValue.text а потом надо этот текст(измененный) сохранить обратно в myXML, из которого грузилось дерево. И вообще возможно это сделать?
UPD: Есть свойство value у дерева, но оно возвращает undefined.Странно, т.к. nodeValue возвращает содержимое узла,а это должно возвращать, как я понял содержмое всего дерева. Может я что-то неправильно понял?

alexcon314
24.08.2008, 23:24
Есть свойство value у дерева
Если речь идет о компоненте Tree (Falsh 8), то о каком свойстве вы говорите? Я не знаю такого.
Текстовые ноды в датапровайдере Tree не катят. Катят атрибуты. В них можно сохранять.
.dataProvider в любой момент времени дает объективное состояние xml'а, который отображается с помощью этого компонента.

swat05
25.08.2008, 00:54
Если речь идет о компоненте Tree (Falsh 8), то о каком свойстве вы говорите? Я не знаю такого.

Когда открываете АС то слева от него появляется окошко, а там Components>Tree>Properties>value. Но спомощью этого сохранять не получается. А о каких атрибутах вы говорите. Мне же надо сохранять Содержимое Дерева в ХМЛ-переменную, чтобы при изменении одного узла дерева и переходе на другой узел дерева, измененные данные первого узла сохранялись. Я написал что-то типа этого, но, увы, не работает - onEnterFrame = function() {
myXML = myTree.value;
myTree.dataProvider = myXML;
} А как такого рода сохранение можно сделать с помощью атрибутов? И с помощью каких атрибутов можно сохранять датаПровайдер?

alexcon314
25.08.2008, 09:46
Когда открываете АС то слева от него появляется окошко
Это вы про панельку Actions toolbox говорите, что привязана к окну редактора скриптов? Хм.. и правда есть там такое свойство, хотя в хэлпе про него ничего не говорится. Никогда не пользовался value. Оно почему-то действительно возвращает undefined. Ну и бог с ним.
Теперь про аттрибуты и текстовые ноды. вот пример текстового узла.
<node>any text</node>
Ноды такого типа компонент отображает некорректно.
А вот пример аттрибутов узла
<node mytext="any text"/>
Обратиться к аттрибуту в дереве
myTree.selectedNode.attributes.mytext = "new any text"
В энтерфрейм писать не надо ничего для "обновления" дерева.
Когда вам нужно сохранить хмл
Save(myTree.dataProvider)
Save() - это ваша функция, сохраняющая хмл.

swat05
25.08.2008, 11:40
не понял, save() это должна быть функция, которая сохраняет ХМЛ на диск? Чето я не понимаю. то есть я должен сохранить myTree.dataProvider? типа так - myXML = myTree.dataProvider;
myTree.dataProvider = myXML; но так не сохраняется содержимое нодов.

alexcon314
25.08.2008, 13:01
то есть я должен сохранить myTree.dataProvider
Дерево (компонент Tree) - визуальное представление объекта XML.
Tree имеет свойство dataProvider. Это свойство есть ссылка на фактически отображаемый деревом XML. При манипуляциях с нодами Tree все изменения немедленно вносятся в XML, ибо это одно и тоже.
Вы грузите хмл, отображаете его деревом, чего-то там меняете. Например, изменили аттрибут какого-то узла, добавили новый узел, удалили и т.п. На выходе myTree.dataProvider дает ссылку на измененный хмл. Его надо просто сохранить.
Save() - это ваша функция сохранения хмл. Как вы его там сохраняете и куда - дело ваше. Но сам сохраняемый хмл можно всегда получить через myTree.dataProvider, причем он будет со всеми внесенными изменениями уже.
Ваш код избыточен. Этого делать не надо.
myXML = myTree.dataProvider;
myTree.dataProvider = myXML;

swat05
25.08.2008, 13:09
если протрейсить измененный Tree(его дата провайдер), то он не отображает ни у одного узла nodeValue.Я не знаю почему такое происходит! Отдельно большое спасибо, за то что рассказали что такое дата провайдер. Я думал что он только для записи))). Но как же решить вопрос с nodeValue??

alexcon314
25.08.2008, 13:45
nodeValue - для текстовых нод хмл'а. У myTree.dataProvider нет (не должно быть) текстовых нод. Используйте аттрибуты.

swat05
25.08.2008, 14:11
почему у дата провайдера нет nodeValue? почему если написать myTree.selectedNode.nodeValueто возвратится именно содержание nodeValue. Ну а поскольку информация в дерево закачивается с помощью датаПровайдера, то можно предположить что у него есть текстовые ноды. Ну в крйнем случае, он может читать раздел CDATA?

alexcon314
25.08.2008, 15:37
Я, видимо, чего-то недопонимаю.
если протрейсить измененный Tree(его дата провайдер), то он не отображает ни у одного узла nodeValue
если написать
myTree.selectedNode.nodeValue то возвратится именно содержание nodeValue.
Компонент Tree не может использовать любые структуры XML. Для него нужна вполне определенная структура. Обязательно наличие аттрибута label для каждого узла. Например, текст в узлах он отображает некорректно, поэтому в XML-е, который используется как датапровайдер для дерева, не должно быть текстовых узлов. Каким образом вы отображаете текстовые узлы в компоненте Tree и как вы получаете nodeValue я в толк не возьму никак. Выложите исходник.
Вот кусок из хэлпа:
Formatting XML for the Tree component
The Tree component is designed to display hierarchical data structures using XML as the data model. It is important to understand the relationship of the XML data source to the Tree component.

Consider the following XML data source sample:

<node>
<node label="Mail">
<node label="INBOX"/>
<node label="Personal Folder">
<node label="Business" isBranch="true" />
<node label="Demo" isBranch="true" />
<node label="Personal" isBranch="true" />
<node label="Saved Mail" isBranch="true" />
<node label="bar" isBranch="true" />
</node>
<node label="Sent" isBranch="true" />
<node label="Trash"/>
</node>
</node>

NOTE

The isBranch attribute is read-only; you cannot set it directly. To set it, call Tree.setIsBranch().


Nodes in the XML data source can have any name. Notice in the previous example that each node is named with the generic name node. The tree reads through the XML and builds the display hierarchy according to the nested relationship of the nodes.

Each XML node can be displayed as one of two types in the tree: branch or leaf. Branch nodes can contain multiple child nodes and appear as a folder icon with an expander arrow that allows users to open and close the folder. Leaf nodes appear as a file icon and cannot contain child nodes. Both leaves and branches can be roots; a root node appears at the top level of the tree and has no parent. The icons are customizable; for more information, see Using skins with the Tree component.

There are many ways to structure XML, but the Tree component cannot use all types of XML structures. Do not nest node attributes in a child node; each node should contain all its necessary attributes. Also, the attributes of each node should be consistent to be useful. For example, to describe a mailbox structure with a Tree component, use the same attributes on each node (message, data, time, attachments, and so on). This lets the tree know what it expects to render, and lets you loop through the hierarchy to compare data.

When a Tree displays a node, it uses the label attribute of the node by default as the text label. If any other attributes exist, they become additional properties of the node's attributes within the tree.

The actual root node is interpreted as the Tree component itself. This means that the first child (in the previous example, <node label="Mail">), is rendered as the root node in the tree view. This means that a tree can have multiple root folders. In the example, there is only one root folder displayed in the tree: Mail. However, if you were to add sibling nodes at that level in the XML, multiple root nodes would be displayed in the tree.

A data provider for a tree always wants a node that has children it can display. It displays the first child of the XMLNode object. When the XML is wrapped in an XML object, the structure looks like the following:

<XMLDocumentObject>
<node>
<node label="Mail">
<node label="INBOX"/>
<node label="Personal Folder">
<node label="Business" isBranch="true" />
<node label="Demo" isBranch="true" />
<node label="Personal" isBranch="true" />
<node label="Saved Mail" isBranch="true" />
<node label="bar" isBranch="true" />
</node>
<node label="Sent" isBranch="true" />
<node label="Trash"/>
</node>
</node>
</XMLDocumentObject>


Flash Player wraps the XML nodes in an extra document node, which is passed to the tree. When the tree tries to display the XML, it tries to display <node>, which doesn't have a label, so it doesn't display correctly.

To avoid this problem, the data provider for the Tree component should point at the XMLDocumentObject's first child, as shown here:

myTree.dataProvider = myXML.firstChild;

swat05
25.08.2008, 15:56
тут исходник и ХМЛ

alexcon314
25.08.2008, 17:07
Насколько я понял, для корректного отображения хмл'а вы пытаетесь текст из каждого текстового узла запихнуть в свойство nodeValue другого (родительского) узла, который изначально текстовым и не является вовсе, а сам текстовый узел просто удаляете. (Это вы делаете сразу после загрузки хмл, пропуская его через ряд вложенных циклов, которые, видимо, реализуют что-то наподобие рекурсивного обхода всего хмл.) В итоге в nodeValue оказывается undefined. И о каком соответствии исходного хмл и хмл-провайдера дерева в этом случае идет речь? Вы создаете другой объект на основе исходного.
Что вам мешает переписать текст в аттрибут родительского узла? Но тут возникает вопрос с CDATA и обратным сохранением отредактированного текста. Опять придется преобразовывать объекты друг в друга. Вам придется делать обратную операцию "превращения" атрибута в дочерний текстовый узел. Зачем такая канитель? Все это лишено здравого смысла.
Если вам надо сопоставить узлу текст c html-форматированием, грузите его из отдельного файла. Ссылку на файл как раз можно хранить в аттрибуте узла. Для хранения простого текста вполне хватит аттрибутов.

swat05
25.08.2008, 19:39
т.е. вы предлагаете не передалывать по 300 CDATA в nodeValue, а потом обратно? а перевести в атрибут а потом обратно? но как тогда быть с разделом CDATA? Это же как-то некрасиво получается.

alexcon314
25.08.2008, 23:36
т.е. вы предлагаете не передалывать по 300 CDATA в nodeValue, а потом обратно? а перевести в атрибут а потом обратно? но как тогда быть с разделом CDATA? Это же как-то некрасиво получается.
Я не ясно выразился?
Зачем такая канитель? Все это лишено здравого смысла.
Вы последнее предложение читали?
Мысль простая. Не грузить в дерево ВСЕ, грузить только иерархическую структуру вашего справочника, оглавление (сорри, если не точно назвал ваш проект), оформленную под использование ее деревом, т.е с известными ограничениями.
Весь текст грузить отдельно, из нормального xml-а, где можно использовать на полную катушку и cdata и текстовые ноды и все что угодно. Все что нужно сделать, в хмл-оглавление воткнуть аттрибуты-ссылки на ноды хмл-я с текстом.
Отредактированный текст сохранять обратно в тотже хмл. Отредактированное оглавление - в свой хмл.
Если текста действительно много - можно разбить его по папкам/файлам, например, каждый раздел - отдельный файл.