0

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

我正在编写的类中生成一个 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()...数字应该是我应该插入的当前位置?感觉很笨拙。

4

3 回答 3

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);
});

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

于 2010-01-10T06:14:32.433 回答
0

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

您仍然可以<element>通过访问base.container.*.element.

于 2010-09-11T07:24:30.993 回答
-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
于 2014-01-10T15:20:18.937 回答