我正在尝试将XML文件中的数据加载到flash对象中。在actionscript中制作flash对象时,它看起来像这样:
var presentationObj:Object = {
casestudies: {
audi: {
titleStr: 'Audi',
placement: 'study',
slides:{
1:{ src:'img/page1.jpg', group:'img' },
2:{ src:'img/page2.jpg', group:'img' }
}
}
}
这是有效的。我试图使用相同的格式将XML加载到flash对象(所以我可以保留我已经使用的其余代码)。我不知道如何去做这件事。有什么想法吗?
答案 0 :(得分:1)
查看课程XML和XMLNode上的AS3文档。你可以通过手工循环遍历节点树的级别并根据需要加载节点内容和属性来实现一个简单的加载器(取决于你的XML模式是什么样的,如果你还有)。
编辑:找到我的XML来对象解析代码:
public function xml2Object(baseNode:XMLNode):Object {
var xmlObject:Object = new Object;
// attributes
var attribs:Object;
for (var attribName:String in baseNode.attributes) {
if (attribs == null)
attribs = new Object;
attribs[attribName] = parseXMLValue(baseNode.attributes[attribName]);
}
if (attribs != null)
xmlObject["_attrib"] = attribs;
// children
for (var childNode:XMLNode = baseNode.firstChild; childNode != null; childNode = childNode.nextSibling) {
// if its a text node, store it and skip element parsing
if (childNode.nodeType == 3) {
xmlObject["_text"] = parseXMLValue(childNode.nodeValue);
continue;
}
// only care about elements from here on
if (childNode.nodeType != 1)
continue;
// parse child element
var childObject:Object = xml2Object(childNode);
// no child exists with node's name yet
if (xmlObject[childNode.nodeName] == null)
xmlObject[childNode.nodeName] = childObject;
else {
// child with same name already exists, lets convert it to an array or push on the back if it already is one
if (!(xmlObject[childNode.nodeName] instanceof Array)) {
var existingObject:Object = xmlObject[childNode.nodeName];
xmlObject[childNode.nodeName] = new Array();
xmlObject[childNode.nodeName].push(existingObject);
}
xmlObject[childNode.nodeName].push(childObject);
}
}
return xmlObject;
}
public function parseXMLValue(value:String):Object {
if (parseFloat(value).toString() == value)
return parseFloat(value);
else if (value == "false")
return false;
else if (value == "true")
return true;
return value;
}
xml2Object将转为:
<some_object>
<sub_object someAttrib="example" />
<sub_object anotherAttrib="1">
<another_tag />
<tag_with_text>hello world</tag_with_text>
</sub_object>
<foo>bar</bar>
</some_object>
成:
{
some_object:
{
sub_object:
[
{
_attrib:
{
someAttrib: "example"
}
},
{
tag_with_text:
{
_text: "hello world"
},
another_tag:
{
},
_attrib:
{
anotherAttrib: 1
}
}
],
foo:
{
_text: "bar"
}
}
}
答案 1 :(得分:1)
试试这个。请注意,所有键和值最终都是字符串。
给出以下XML:
<test id="an ID">
<subnode>
<subsubnode>
Cheese
</subsubnode>
</subnode>
</test>
它应该生成以下对象:
{ id: "an ID", subnode: { subsubnode: "Cheese" } }
免责声明:未经过彻底测试!
function objectFromXML(xml:XML):Object
{
var obj:Object = { };
// Check if xml has no child nodes:
if (xml.hasSimpleContent()) {
return String(xml); // Return its value
}
// Parse out attributes:
for each (var attr:XML in xml.@ * ) {
obj[String(attr.name())] = attr;
}
// Parse out nodes:
for each (var node:XML in xml.*) {
obj[String(node.localName())] = objectFromXML(node);
}
return obj;
}
答案 2 :(得分:0)
XML有其他对象语义而不是ECMAscript ...所以这总是有点不愉快...你应该考虑使用JSON而不是XML ...它也是标准化的,它更小,对待数值和布尔值本身和还有其他一些优点......但最重要的是,语义是相同的......
XML的一个问题是,{ foo: "bar" }
可能是<node foo="bar" />
或<node><foo>bar</foo></node>
...而且还不清楚,节点的名称应该来自......等等。 ..通常不清楚,对象的合理且唯一的XML表示是什么,或者XML应该如何转换为对象树......
在AS3中进行简单而优雅的XML操作,请查看E4X
但实际上,我会使用JSON(使用as3corelib进行解码)......
希望有帮助......:)
格尔茨
back2dos