最好通过一个例子说明这一点:
var xml1:XML = new XML("<root> <key>value1</key> </root>");
var xml2:XML = new XML("<root> <key>value1</key> <key>value2</key> </root>");
var xml3:XML = new XML("<root> <key>value1</key> <key2>value2</key2> </root>");
for each (var xml:XML in [ xml1, xml2, xml3 ])
{
var result:XMLList = xml.(key == "value1").key;
}
在所有三种情况下,我希望过滤的XMLList有一个节点(result.length()== 1)。在xml1和xml3上运行时就是这种情况。但是,在过滤xml2(result.length()== 0)时没有找到任何内容。关键的区别似乎是在xml2中,重复了“key”子标记。
这是一个错误(编译器?运行时?)还是我做错了什么?
答案 0 :(得分:1)
实际上,在XMLList
的情况下,我会期望它返回xml2
长度2 。 应该选择包含名为&#34; key&#34;的节点的父元素。使用值&#34; value1&#34;,然后过滤所有名为&#34; key&#34;的节点。
不知道为什么它没有。这是一些E4X语法,可以执行我在上面描述的内容:
var result:XMLList = xml.(descendants("key").text().contains("value1")).key;
result
长度:
另一方面,如果您期望的是 ,那么名为&#34; key&#34;的节点并使用值&#34; value1&#34;,您可以尝试:
var result:XMLList = xml..key.(text() == "value1");
result
长度:
答案 1 :(得分:0)
好的,我想我已经弄明白了这是怎么回事。我误解了语法。
在我的原始示例中,xml。(key ==“value1”)选择一个根节点,其中“key”属性与字符串“value1”匹配。
对于xml1和xml3,其中只有一个“key”节点,xml.key的值是一个单元素XMLList,其字符串转换为其文本值,因此与“value1”的比较有效。
对于xml2,其中有两个“key”节点,xml。(key ==“value1”)的值是一个双元素XMLList,它将两个完整的XML编码内容串起来。 XML节点,标签和所有。因此,与“value1”的比较失败,表达式的值为空。
没有编译器或运行时错误,只是一个混乱的程序员。
答案 2 :(得分:0)
AS3的XML对象有一些很酷的技巧, 基于标签名称的列表非常简单。
var xml:XML = new XML("<root> <key>value1</key> <key>value2</key> </root>");
var result:XMLList = xml.key;
这将创建一个长度为2的XMLList,每个节点都带有“key”标签,你也可以为某些子节点扩展它(即xml.doors.locks.key)。
您还可以使用前缀“@”创建基于节点属性的列表。
var xml:XML = new XML("<root> <key name=\"k1\">value1</key> <key name=\"k2\">value2</key> <key name=\"k3\">value3</key> </root>");
var result:XMLList = xml.key.@name;
如果您有多个列表,也可以连接。
var xml1:XML = new XML("<root> <key>value1</key> <key>value2</key> <key>value3</key> </root>");
var xml2:XML = new XML("<root> <key>value4</key> <key>value5</key> <key>value6</key> </root>");
var list:XMLList = xml1.key;
list += xml2.key;
希望这有帮助。