В AS3 как использовать значение узла XML в качестве другого узла?

#xml #flash #apache-flex #actionscript-3 #adobe

#xml #flash #apache-flex #actionscript-3 #adobe

Вопрос:

Предположим, у меня есть XML

 <xml>

<lang>en</lang>
<en>
    <text id="123">One Two Three</text>
    <text id="hello">Hello</text>
</en>

</xml>
  

тег «en» используется только в том случае, если значение lang равно «en».
Если значение lang равно «de»

 <lang>de</lang>
<de>
        <text id="123">One Two Three</text>
        <text id="hello">Hello</text>
</de>
  

Как мне динамически получить это имя в моем коде actionscript 3.

Предположим, я хочу использовать

 var xmlVal = new XML(... the above xml)
var lang = xmlVal.lang;
  

Я не могу использовать if (xmlVal.lang == «en») .. потому что значением lang может быть любая строка. но с этим именем должен быть дочерний узел ..!!

Как мне получить значения из узла «en или de или что еще ..»??

Комментарии:

1. Я не уверен, работает ли следующее, но вы пробовали: var langXml:* = xmlVal[xmlVal.lang]; ?

Ответ №1:

Не тестировал, но это должно дать вам общее представление (которое вы можете динамически выбирать с помощью «ключа»):

 var xmlVal:XML = new XML(... the above xml);

var type:String = xmlVal.lang;

var result:XML = xmlVal[type];
  

Комментарии:

1. хотя это немного более конкретно, вы также можете проверить if( xmlVal.en != undefined )

2. 1. Введите свои переменные. 2. Не используйте конструкторы в классах верхнего уровня (за исключением векторов и массивов, которые имеют заданную длину).

3. @cwallenpoole: Что вы подразумеваете под # 2? Вы имеете в виду new XML(... ?

Ответ №2:

Попробуйте использовать:

 var lang:String = xmlVal.lang;
var strings:XMLList = xmlVal.elements(lang).text;
  

Ответ №3:

Это один из более расширяемых и согласованных способов сделать это.

 var xmlVal:XML = XML( /*above*/ );
// xmlVal.child("lang"); is a long-hand for xmlVal.lang, but more explicit
// it can also save you headache later in some corner cases.
var langs:XMLList = xmlVal.child("lang"); 
// if there is only one lang child, this will grab its' child text
// use toString to make sure you only grab the string pieces.
var langVal:String = langs[0].text().toString().replace(/s/g, "");
var langValue:XMLList = xmlVal.child(langVal);
  

Тем не менее, вам лучше, если вы можете изменить его с:

 ...
<lang>en</lang>
<en>
  

Для

 ...
<lang abbreviation="en"><text id="123">One Two Three</text>
    <text id="hello">Hello</text></lang>
  

Затем вы можете вызвать:

 var xmlVal:XML = XML( /*above*/ );
var finalList:XMLList = xmlVal.child( "lang" ).( @abbreviation == "en" );