2009-11-10 3 views
1

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

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

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

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

ответ

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, то вы можете использовать для ... в синтаксисе для достижения что вы хотите:

// 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 ]); 
} 
0

Каждый тег 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); 
} 
2

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

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

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

foreach(var child : XMLNode in xml.LocationInfo.childNodes) 
{ 
    trace(child.localName + " = " + child.nodeValue); 
} 
Смежные вопросы