XML在flex方面很酷,但我有一个烦人的问题要解决,因为我能想象的是一个功能。你看,当你只有一个东西的标签时,它会创建一个不是数组的对象。但是当找到多个时,它会将它放在数组结构上。
我想优雅地解决它。任何建议。
示例:这说明了它是HTTP请求的结果:
private function initXMLRes(event:ResultEvent):void
{
var resObj:Object = event.result;
//
for each(var i:Object in resObj.specifictag)
{
// to use specifictag attributes, etc. example:
Alert.show(specifictag.name);
}
}
之前的代码将使用2个以上的项目。它会接受这个xml:
<specifictag name="one" /><specifictag name="two" />
......但不是这一个:
<specifictag name="one" />
我可以检查resObj.specifictag的格式(以检查它是否有数组),然后复制代码(对于每种情况)。但是 - 即使它正在调用一个函数 - 我认为它不是一个优雅的解决方案。
好吧,我希望有人对此事有好主意。 (我从经验中知道,SO比Flex有更多的C ++专家,但是......)
完美的事情是HTTPrequest以一致的方式处理每个标签(总是使用数组......虽然我猜这也有它的缺点)。
谢谢!
答案 0 :(得分:2)
我认为问题实际上是一个错误,您可以在HTTPService结果处理程序中处理并强制将返回的对象作为数组集合。这是我的应用程序的片段。
if (evt.result.rows.row is ArrayCollection) {
MyAC= evt.result.rows.row;
}else{
MyAC= new ArrayCollection(ArrayUtil.toArray(evt.result.rows.row));
}
所以它应该对你有用:
var resObj:Object = new Object();
if (event.result.rows.row is ArrayCollection) {
resObj= event.result
}else{
resObj= new ArrayCollection(ArrayUtil.toArray(event.result));
}
答案 1 :(得分:0)
这是我目前的解决方案:
// historial
var hist:ArrayCollection = new ArrayCollection();
if(resObj.hist[0])
hist = resObj.hist;
else
hist.addItem(resObj.hist);
答案 2 :(得分:0)
听起来你的<specifictag>
元素是顶层而不是其他根目录? XML文档只能有一个根,因此在这种情况下,您实际上在某些情况下会获得XML文档,而在其他情况下会获得ArrayCollection
个XML文档。如果您将服务更改为始终返回单个XML容器,该容器的子容为specifictag
,则不必担心此问题。
以下代码演示了迭代一个元素与处理XML对象时迭代多个元素的工作方式相同。
private function init():void {
trace("Iterating two children");
iterate(<root><child /><child /></root>);
trace("Iterating one child:");
iterate(<root><child /></root>);
}
private function iterate(x:XML):void {
for each(var element:XML in x.child) {
trace(element.name());
}
}