EDITx2:下面的问题似乎是由与我的 XML 模式相关的属性引起的,我主要使用这些属性,因此我可以在 FB 4.7 中验证我的 XML,并且一旦 XML 嵌入到应用程序本身中就不需要了。
创建一个与我的 XML 文档相同但省略 xmlns、xmlns:xsi 和 xsi:schemalocation 属性的 XML 对象会在 AS 中生成一个可以正确导航的 XML 对象。包括它们不仅会导致以下问题,还会导致 xmlns 和 xmlns:xsi 属性沿树向下传递,使得原始 XML 对象的基于 XMLList 的子集同样难以剖析。下面的代码示例已更新以显示该现象。
现在的问题变成了:当我以某种方式嵌入 XML 时,是否可以剥离与模式相关的属性,或者以其他方式使它们对 AS 更友好?
编辑:我遇到的问题似乎与嵌入的 XML 文档特别相关;在 AS3 中直接创建的 XML 变量可以正常遍历。
我在 AS3 中遇到了一个看似荒谬的问题。让我们假设一个名为 example.xml 的 XML 文档如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<myParent xmlns="http://www.example.com/Schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/Schema Schema.xsd">
<myChild id="1">
<myGrandchild cid="1" />
<myGrandchild cid="2" />
</myChild>
<myChild id="2">
<myGrandchild cid="3" />
</myChild>
</myParent>
然后我尝试通过嵌入将它分配给 AS3 中的静态常量(以便在其本机类之外访问),如下所示:
[Embed(source="example.xml", mimeType="application/octet-stream")]
private static const exampleXML:Class;
public static const myXML:XML = XML(new exampleXML);
然后我想用 XMLList 从中提取元素/节点。这就是我遇到的问题。这里有两个可以按我预期工作的示例,然后是三个不可以的示例:
// #1
var myList:XMLList = myXML.*;
trace(myList);
/*
<myChild id="1" xmlns="http://www.example.com/Schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<myGrandchild cid="1" />
<myGrandchild cid="2" />
</myChild>
<myChild id="2" xmlns="http://www.example.com/Schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<myGrandchild cid="3" />
</myChild>
*/
// #2
var myList:XMLList = myXML.*.(@id==1);
trace(myList);
/*
<myChild id="1" xmlns="http://www.example.com/Schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<myGrandchild cid="1" />
<myGrandchild cid="2" />
</myChild>
*/
// #3
var myList:XMLList = myXML.myChild;
trace(myList);
/*
(Outputs nothing at all)
*/
// #4
var myList:XML = myXML.myChild[0];
trace(myList);
/*
null
*/
// #5
var myList:XMLList = myXML.child("myChild");
trace(myList);
/*
(Outputs nothing at all)
*/
理论上,#3 和#5 应该给出与#1 相同的输出,而#4 应该给出与#2 相同的输出。为什么 3-5 出现空白?将 myXML 声明为静态或常量有问题吗?我究竟做错了什么?
显然,我在这里使用了一个非常通用的示例。我正在使用的实际 XML 与 XSD 模式相关联。如果这可能对我的问题有任何影响,请告诉我,我会发布我的实际代码。