I have a widget with some functionality that can load services via a config.xml that might help.http://www.arcgis.com/home/item.html?id=ca9e4de998714d07a6bdc59ededa0efc
/**
* Takes URL for a ArcGIS Server Rest directory and
* will attempt to extract the SiteMap.
* @param directory
*/
protected function loadServices(servername:String):void
{
var service:HTTPService = new HTTPService();
var sitemap:String = "/ArcGIS/rest/services/?f=sitemap";
var url:String = "http://" + servername + sitemap;
service.url = url;
service.resultFormat = "e4x";
var token:AsyncToken = service.send();
token.addResponder(new AsyncResponder(onServiceResults_handler, onFault_handler));
}
/**
* Handles the results of accessing the SiteMap.
* @param event
* @param token
*/
protected function onServiceResults_handler(event:ResultEvent, token:Object = null):void
{
var xml:XML = event.result as XML;
var xmlColl:XMLListCollection = new XMLListCollection(xml.children());
var list:Array = [];
var qn:QName = new QName(sitemapNS, "loc");
var sxml:XML;
for each (sxml in xmlColl)
{
var url:String = sxml[qn].text();
var tmp:Array = url.split("/");
var i:uint = tmp.length;
if (tmp[i-1] == "MapServer")
{
var item:ServiceItem = new ServiceItem();
item.serverType = tmp[i-1];
item.name = tmp[i-2];
item.url = url;
list.push(item);
findServiceDetails(item);
}
}
list.sortOn("name");
dataList = new ArrayList(list);
vUrls = new Vector.<String>(list.length);
servicesList.dataProvider = dataList;
}
/**
* Parses <code>ServiceItem</code> object url to find layer details
* in service REST.
* @param item
*/
protected function findServiceDetails(item:ServiceItem):void
{
var jsonurl:String = "?f=json&pretty=false";
var url:String = item.url + jsonurl;
var srv:HTTPService = new HTTPService();
srv.url = url;
srv.resultFormat = "text";
var token:AsyncToken = srv.send();
token.addResponder(new mx.rpc.Responder(onJSONResult_handler, onFault_handler));
function onJSONResult_handler(event:ResultEvent):void {
var data:String = event.result.toString();
// this regex replace can be used to make parsing the JSON faster.
// It removes spaces, but it will mess up service description.
//data = data.replace( /\s/g, '' );
var details:Object = JSON.decode(data);
item.description = details["serviceDescription"];
if (!details["singleFusedMapCache"])
item.type = DYNAMIC;
else
item.type = TILED;
}
}
This will get you as far as loading the individual URL's for each service in a server, like "sampleserver1.arcgisonline.com", then you can create a layers using the URL and pull out the Layer info via layerInfos. I have a function for another tool that does just that.
/**
* Will find all the items that make up a given map service layer.
* @param lyr
*/
protected function findLayerDetails(lyr:Layer):void
{
if (layers)
layers.removeAll();
layers = new ArrayList();
var layerInfos:Array;
layerIDSet = null;
layerIDSet = {};
if (lyr is ArcGISDynamicMapServiceLayer)
layerInfos = ArcGISDynamicMapServiceLayer(lyr).layerInfos;
else if (lyr is ArcGISTiledMapServiceLayer)
layerInfos = ArcGISTiledMapServiceLayer(lyr).layerInfos;
else if (lyr is FeatureLayer) {
var lyrId:int = FeatureLayer(lyr).layerDetails.id;
var lyrName:String = FeatureLayer(lyr).layerDetails.name;
layerIDSet[lyrName] = lyrId;
layers.addItem(lyrName);
}
if (layerInfos)
{
var info:LayerInfo;
for each (info in layerInfos)
{
layerIDSet[info.name] = info.id;
layers.addItem(info.name);
}
}
}