AS3: вставка элементов XML в алфавитном порядке по свойству - PullRequest
0 голосов
/ 10 января 2010

Итак, у меня немного сложная проблема ...

Я генерирую XML-файл в классе, который пишу. Допустим, это был начальный XML:

<base>
    <container id="0">
        <element type="Image" x="0" y"0" />
        <element type="Image" x="100" y"0" />
    <container/>
</base>

Я хочу добавить дополнительные <element>. Первый порядок сортировки - по «типу», затем «х», затем «у». Поэтому, если я добавлю новый «тип» <element>, скажем, «Текст», я хочу, чтобы текст вставлялся после любого «Изображения» <element>.

Например:

<base>
    <container id="0">
        <element type="Image" x="0" y"0" />
        <element type="Image" x="100" y"0" />
        <element type="Text" x="200" y"100" />
    <container/>
</base>

Основная идея состоит в том, чтобы сохранять список отсортированным, поскольку я добавляю больше <element> к каждому <container> ... Числовая сортировка достаточно проста, но я не могу найти чистый способ сортировки по алфавиту.

Предложения приветствуются.

Единственное, о чем я могу думать, - это поместить типы в массив. Добавьте "новый тип", сортируйте и вызывайте indexOf () ... число ДОЛЖНО быть текущей позицией, которую я должен вставить раньше? Чувствует себя клёвым.

Ответы [ 3 ]

0 голосов
/ 11 сентября 2010

Можете ли вы изменить структуру XML? Вы можете обернуть все элементы Image в узле <images>, элементы Text в узле <texts> и т. Д., И таким образом будет легко добавить элементы в нужное место.

Вы все еще можете получить все узлы <element>, открыв base.container.*.element.

0 голосов
/ 10 января 2014

проверено ... при условии, что у вас есть действительный XML, и вы создаете переменную для отсортированного XML с тем же корневым дочерним элементом, что и исходный XML.Мои просто оказались устройствами.

var sortedXML:XML = <devices></devices>;

function sortBy(xmlFile:XML , field:String, order:int)
{
    // array that will hold index of nodes
    var arr:Array = new Array();
    // loop through nodes
    for each (var someNode:XML in xmlFile.*)
    {
        // array gets populated with node that matches 'field'
        arr.push(someNode.child(field));
    }
    // sort the 'arr' array alphabetically
    arr.sort();

   // reverse the alphabetical order if necessary
   if (order == -1)
   {
      arr.reverse();
   }

   // append the nodes in from the source, in the order of the array
   for (var i:int=0; i<arr.length; i++)
   {
    sortedXML.appendChild(myXML.device.(child(field) == arr[i]));
   }
}
// trace your original xml then trace sortedXML to verify
0 голосов
/ 10 января 2010

Я бы предложил прочитать все существующие элементы XML в массив, добавить новые элементы, отсортировать массив, а затем записать каждый элемент обратно. Это может быть проще, чем пытаться выяснить, по какому индексу должен быть вставлен каждый новый элемент. Однако это может быть не очень эффективно, в зависимости от вашей ситуации.

Для сортировки я бы попробовал что-то вроде этого (не проверено):

array.sort(function (a:XML, b:XML) {
    if (a.@type < b.@type) return -1;
    if (a.@type > b.@type) return +1;
    if (Number(a.@x) != Number(b.@x)) return Number(a.@x) - Number(b.@x);
    return Number(a.@y) - Number(b.@y);
});

РЕДАКТИРОВАТЬ: Добавлено приведение в функцию сравнения сортировки.

...