QDomNode

慎用elementsByTagName()函数

今天在对基础parse模块进行单元测试,在用自建XML进行测试时发现了一些莫名的小bug。

当然又是一顿查错,最后发现问题在于elementsByTagName函数,它竟然是大小写敏感(case insensitive)的!!这种着实下流的设计……也就是说找“Node1”是不会找到“node1”的。

这样的话在调用各家的open api时,可靠性就完全依赖人品了,太不安全了,哎,基础模块小规模重构。

QDomNode的nodeValue()为空的原因与解决

这几天在把之前基于VCL写的淘宝TOPSDK用Qt重构,涉及到XML解析的部分调试了很久。遇到QDomNode取值时一直为空的情况,最后发现是平时习惯的微软DOM与W3C标准的DOM有区别造成的。

举个例子:

<tid>
12345678
</tid>

在此处,如果此时变量node(类型为QDomNode)指向了“<tid>”,那么要取到“12345678”这个值不能直接用node.nodeValue,而要用node.firstChild().nodeValue()

这是为毛!?很多人可能不理解,其实在标准W3C的DOM中,12345678这个值是属于一个隐含的文本域节点中的,就是实际上是下面这样的(text标签仅为解释原理):

<tid>
<text>12345678</text>
</tid>

微软下流就下流在各种业界标准他都想要小改一下,改得与标准不兼容而看起来又像那么回事。当初vj++想祸害java不能跨平台(没成功出了c#),人家用“/”他就非得用“”,别人搞3D是右手坐标系吧DirectX就非得用坑爹的左手坐标系。

这个dom的区别对我影响不大,反正解析器是我来定的,只要根据当前解析器的标准来写就好,可是如果是做网站前端的就苦逼了,ajax需要写多余的兼容判断。