Posts Tagged ‘XML’

XML、XMLList的hasSimpleContent和hasComplexContent方法

Tuesday, January 12th, 2010

在那篇关于XMLList和null的文章(《你认为自己懂ActionScript么?》)中,涉及到了XMLList的hasSimpleContent方法。为了不让自己因为ActionScript语法问题而汗颜,决定仔细研究这两个属性。

如果 XML 对象表示文本节点、属性节点或不包含子元素的 XML 元素,则表明它包含简单内容。 表示注释和处理指令的 XML 对象不包含简单内容。例如:

var xml : XML = <foo><a>TVUPlayer</a><a><b/></a></foo>;
trace(xml.a[0].hasSimpleContent()); //结果是true
trace(xml.a[1].hasSimpleContent()); //结果是false

在上述例子中,a[0]节点只包含一个简单的文本,包含简单内容,trace的结果为true;a[1]节点包含了一个子元素,表明含有复杂元素,trace的结果为false。如果用方法hasComplexContent来判断上例,则得到的结果相反。

trace(xml.a[0].hasComplexContent()); //结果是false
trace(xml.a[1].hasComplexContent()); //结果是true

对于XMLList的hasSimpleContent判断就相对复杂一点,满足以下3个条件至少1个就认为是包含简单内容:

  • XMLList 对象为空,即对象是null的时候。
  • XMLList 对象包含单个(xml对象的length是1的时候)带有简单内容的 XML 项,如你认为自己懂ActionScript么?》的那个实例xml。
  • XMLList 对象不包含元素,对象的length是0的时候。
  • 如果XMLList满足以下条件中的任意1条,就判断其是包含复杂内容的:

  • XMLList 对象包含一个具有复杂内容的 XML 项。
  • XMLList 对象包含元素。
  • 你认为自己懂ActionScript么?

    Monday, January 11th, 2010

    在flexcoders的邮件列表上,Dave Glasser(dglasser@pobox.com)发了一个“So you think you know ActionScript? ”的邮件,问了一道很有意思的题。在正确答案出来后,花了我1个多小时研究答案才搞明白。真是让我汗颜,我真的是不懂ActionScript。

    var xml:XML = <outer><inner>null</inner></outer>;
    var xmlList:XMLList = xml.inner;
    trace(xmlList == null);

    trace运行的结果是true,xmlList包含了一个xml对象,那为什么和“null”比较会是true呢? Dave Glasser花了4个小时去寻找这个原因,甚至一度认为这是AS 3的一个bug。那最终的答案是什么呢,Dave Glasser在随后的邮件中公布了答案,邮件的英文写的比较简洁,我把对答案的分析阐述以下。

    整个问题的核心是“==”运算符,当比较的双方是不同的数据类型的时候,会有一些列比较的原则,细节可以在Adobe AS 3.0 语言说明中看到。

    当“==”的一个操作数是XMLList对象时,并且当XMLList的length属性是1时,那么使用XMLList的第一个XML对象和“==”的另一个操作数比较。

    问题转换为一个XML对象(null)和“null”比较了。

    当”==”的一个操作数是XML对象时,并且包含简单内容即hasSimpleContent() == true时,”==”的两个操作数都转化为String进行比较。XML对象调用toString()方法得到的是”null”这个字符串,null转换为字符串是”null”,所以trace的结果为true。

    在这一系列的类型转换后,程序终于出现了意外的结果。所以如果你用“===”进行比较就会得到想要的false,因为它不用进行类型转换。

    最后Adobe Flex SDK Team的Gordon Smith也在邮件列表中表态:

    Well, the == operator produces a lot of “interesting” behavior. That’s why there’s a === operator.