所以我有一个稍微棘手的问题......
我正在写一个类中的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()...数字应该是我之前应该插入的当前位置?感觉很糟糕。
答案 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