AS3:按属性按字母顺序插入XML元素

时间:2010-01-10 03:08:01

标签: xml actionscript-3 sorting e4x alphabetical

所以我有一个稍微棘手的问题......

我正在写一个类中的XML文件。假设这是起始XML:

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

我想添加额外的<element>。排序的第一顺序是“类型”,然后是“x”,然后是“y”。因此,如果我添加<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 :(得分:0)

我建议将所有现有的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);
});

编辑:在排序比较功能中添加了强制转换。

答案 1 :(得分:0)

您可以更改XML结构吗?您可以将所有Image元素包装在<images>节点,<texts>节点中的Text元素等等,这样就可以很容易地将元素添加到正确的位置。

您仍然可以通过访问<element>来获取所有base.container.*.element个节点。

答案 2 :(得分:-1)

测试...假设您具有有效的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