1

我正在尝试从 XML 文件中获取文本(此文本稍后将被翻译,因此必须在外部保存)并将其导入 Flash (AS2) 中的单独动态文本框。文本框首先按行(例如 r1)然后按页(例如 p1)最后按文本行(例如 l1)组织,因此要更改第一行、第一页、第一行中的文本,您需要输入r1.p1.l1.text = "sometext".

这是我的 XML 文件。我需要做的第一件事是id从每个<txt>标签中获取并将其保存为一个变量,我可以将其用作文本框标识符,但我不知道如何!

<?xml version="1.0" encoding="utf-8"?>
<txt id="r1.p1.l1">First line of text</txt>
<txt id="r1.p1.l2">Second line of text</txt>

使用以下函数调用 XML 并相应地填充文本框 -id必须将其转换为实例名称;我试过使用一个变量THE_XML_ID = this[someVar],但也无法让它工作......

function getData()
{
    var txt:XML = new XML();
    txt.ignoreWhite = true;
    txt.onLoad = function(success)
    {
        for (i = 0; i < txt.childNodes.length; i++){
            THE_XML_ID.text = txt.childNodes[i].childNodes[0];
        }
    };
    txt.load("assets/text/text.xml");
}

总结一下:我需要id从 XML 文件中的每个<txt>标记中获取,并将其用作该文本行的文本框标识符 - 任何帮助将不胜感激。

4

2 回答 2

1

对于基本问题 - 来自变量字符串的实例名称 - 您将使用这样一个事实,即任何可以使用点符号访问的对象属性,例如myObject.someProperty也可以使用方括号和字符串访问,例如myObject["someProperty"].

您可以在带有编号标识符的情况下使用它,例如您的情况下的 r1、p1 和 l1。因此,例如,如果变量i的值为 1(即在一个 foo 循环中)r1["p"+i]将引用与r1.p1. 并且假设代码在 r1 存在的范围内执行,您可以使用this, 和 dothis["r"+i]来引用 r1。

因此,在您的情况下,您需要将 id="r1.p1.l2" 与 XML 分开,并使用上述方括号表示法代替 THE_XML_ID 来引用正确的文本框。您还可以重组 XML,以便更轻松地访问行号、页码和行号,例如通过使用<txt page="1" row="1" line="1">First line of text</txt>.

于 2013-04-18T14:49:22.040 回答
1

如果您在 onLoad 方法中执行以下操作:

this['testText'].text = txt.childNodes[0].childNodes[0];

“this”指的是 XML 对象。尝试

_root['testText'].text = txt.childNodes[0].childNodes[0];

无论如何,您的方法将行不通,因为您无法进行如此深入的评估。正如评论中所建议的,最好使用另一种 XML 结构来简化定位,但如果您真的想保持这种逻辑,这里有一个工作示例:

// scope of your displayobjects, here they are on main timeline
var scope:MovieClip = _root; 
// get the id attributes and return the related displayobject
function getTargetFromId(id:String, scope:MovieClip):MovieClip {
    var target:MovieClip = scope;
    var path:Array = id.split('.');
    for (var i:Number=0;i<path.length;i++) {
       target = target[ path[i] ];
     }
     return target;
 }


function getData():Void{
  var txt:XML = new XML();
  txt.ignoreWhite = true;
  txt.onLoad = function(success) {
    for (i:Number = 0; i < txt.childNodes.length; i++){
       var id:String = txt.childNodes[i].attributes.id;
       getTargetFromId(id,scope).text = txt.childNodes[i].firstChild.toString();
    }
  }
  txt.load("assets/text/text.xml");
}
于 2013-04-18T19:19:20.873 回答