Как получить имена тегов XML в AS3

Я пытаюсь получить имена дочерних тегов XML в моей программе AS3. Например, у меня есть файл с такой информацией:

<LocationInfo>
   <City>New York City</City>
   <State>NY</State>
   <Zip>10098</Zip>
</LocationInfo>

Я загружаю файл в ArrayCollection и могу получить доступ к каждому нужному мне элементу по имени, например ["City"] // Возвращает Нью-Йорк

Вместо того, чтобы получить значение, я пытаюсь получить имя тега, например State или Zip вместо NY или 10098.

10.11.2009 20:34:11
3 ОТВЕТА
РЕШЕНИЕ

При работе с XML вам почти всегда лучше использовать XMLListCollection. По большей части вам не потребуется НАСТОЯЩАЯ дополнительная функциональность ArrayCollection, а XMLListCollection, безусловно, значительно облегчит работу. Кроме того, ArrayCollections не всегда правильно сериализует вещи. Я не могу дать вам конкретное обстоятельство, но я знаю, что мне пришлось провести рефакторинг, потому что XML не был должным образом сохранен. И, наконец, XMLListCollection.toXMLString()даст вам гораздо лучшее представление о состоянии данных, чем ArrayCollection.toStringкогда-либо.

С помощью XMLListCollection то, что вы ищете, будет сделано в одном из следующих действий:

var coll:XMLListCollection = <xml-here/>

// Iterate through all of the children nodes
for( var i:int = 0; i < coll.children().length(); i++ )
{
    var currentNode:XML = coll.children()[ i ];
    // Notice the QName class?  It is used with XML.
    // It IS NOT a String, and if you forget to cast them, then
    // currentNode.localName() will NEVER be "city", even though it may
    // trace that way.
    var name:QName      = currentNode.name(); // url.to.namespace::city
    var locName:QName   = currentNode.localName() // City
}

// get all city nodes in the current parent element
var currCities:XMLList = currentParentNode.cities; // currentParentNode can be 
// an XMLList, an XML object, an XMLListAdapter, or an XMLListCollection.
// This means that you can do something like coll.cities.cities, if there are
// children nodes like that.
for( i = 0; i < cities.length(); i++ )
{
    var currentCity:XML = cities[ i ];
}

// get all city nodes in all descendant nodes.
var cities:XMLList = currentParentNode.descendants( 
                         new QName( "url.to.namespace", "City" ) 
                     );
for( i = 0; i < cities.length(); i++ )
{
    var currentCity:XML = cities[ i ];
}

Если вы действительно ДОЛЖНЫ использовать ArrayCollection, то вы можете использовать синтаксис for ... in для достижения желаемого:

// This is one of the few times I recommend anonymous typing.  When dealing with
// XML (which likely has already been turned into a String anyway, but be safe )
// anonymous syntax can give you better results.

// it = iterant, I use this to contrast with i for my sanity.
for(var it:* in coll) 
{
    trace(it,"=",coll[ it ]);
}
3
10.11.2009 21:58:45

Каждый тег LocationInfo становится записью в вашей коллекции ArrayCollection. Каждая запись представляет собой динамический объект, поэтому на самом деле вы спрашиваете, как получить имена свойств из динамического объекта. На это уже ответили, хотя они спрашивали об этом по-другому. Вот ссылка на оригинальную страницу:

https://stackoverflow.com/questions/372317/how-can-i-get-list-of-properties-in-an-object-in-actionscript

И вот ответ, который казался самым простым:

var obj:Object; // I'm assuming this is your object

for(var id:String in obj) {
  var value:Object = obj[id];

  trace(id + " = " + value);
}
0
23.05.2017 12:26:44

Вы можете использовать свойство localName для получения имени элемента XMLNode.

Что-то вроде:

var xml : XML = <LocationInfo>...</LocationInfo>;

foreach(var child : XMLNode in xml.LocationInfo.childNodes)
{
    trace(child.localName + " = " + child.nodeValue);
}
2
10.11.2009 21:36:56