XML HTTPService结果和每个
XML在flex中很酷,但我有一个恼人的问题要解决,这是由我可以想象的一个特性引起的。你看,当你只有一个标记时,它会创建一个不是数组的对象。但当找到多个时,它会将其放在一个数组结构上 我想优雅地解决它。任何建议 示例:这说明了HTTP请求的结果:XML HTTPService结果和每个,xml,apache-flex,object,foreach,httpservice,Xml,Apache Flex,Object,Foreach,Httpservice,XML在flex中很酷,但我有一个恼人的问题要解决,这是由我可以想象的一个特性引起的。你看,当你只有一个标记时,它会创建一个不是数组的对象。但当找到多个时,它会将其放在一个数组结构上 我想优雅地解决它。任何建议 示例:这说明了HTTP请求的结果: private function initXMLRes(event:ResultEvent):void { var resObj:Object = event.result; // for each(var i:Object i
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的格式(检查它是否有数组),然后复制代码(针对每种情况)。但是,即使是调用函数,我也不认为这是一个优雅的解决方案
嗯,我希望有人对这件事有个好主意。(我从经验中知道,所以有很多C++专家比Flex,但是……)
完美的做法是HTTPrequest以一致的方式处理每个标记(使用always数组…尽管我猜这也有其缺点)
谢谢 我认为问题实际上是一个bug,您可以在HTTPService结果处理程序中处理该bug,并强制将返回的对象转换为数组集合。以下是我的应用程序中的一个片段
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));
}
这是我当前的解决方案:
// historial
var hist:ArrayCollection = new ArrayCollection();
if(resObj.hist[0])
hist = resObj.hist;
else
hist.addItem(resObj.hist);
听起来您的
元素是顶级的,而不是在其他根目录中?一个XML文档只能有一个根,因此在本例中,在某些情况下实际上会得到一个XML文档,在其他情况下会得到一个XML文档的ArrayCollection
。如果将服务更改为始终返回一个包含specifictag
的XML容器作为其子容器,则不必担心此问题
下面的代码演示了在处理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());
}
}
private function init():void{
跟踪(“迭代两个子项”);
迭代();
跟踪(“迭代一个子项:”;
迭代();
}
私有函数迭代(x:XML):void{
对于每个(var元素:x.child中的XML){
跟踪(element.name());
}
}
我最终得到了类似的解决方案,但我更喜欢您的代码片段:DNo,它们位于XML的根。。。我将尝试将它们放在根标记下,看看它们是否被视为ArrayCollection。谢谢!这也不起作用,不管他们在哪里。