MSXML的一个令人不爽的地方——M$是故意违背标准的吗?

原创 2004年09月29日 15:03:00

9月教XML课程的时候,使用MSXML来做演示。虽然讲课的时候,我说了不少xml标准的发展,并且说各大厂商将会追随标准不断更新自己的产品。然而事实并非如此。M$就是典型。

MSXML SDK,自毕业论文用过3.0之后,就未再接触过。一直到这次才又捡出来MS XML Core Services 4.0。当前MS最新的XML Parser仍然是发布了很久了的 MSXML 4.0 sp2。我原本以为MSXML 4.0已经支持DOM level 2,但是事实并非如此(相反Mozilla支持了绝大多数DOM2模块以及大量的DOM3特性)。

甚至其对DOM level 1的支持也很令人头大。我写了一段代码,显示一个xml node,一般的,需要根据nodeType来做不同的输出:


    switch (node.nodeType)
    {
        case node.ATTRIBUTE_NODE:
            return "{" + node.namespaceURI + "}" + node.nodeName + ": " + node.nodeValue;
            break;
        case node.TEXT_NODE:
            if (node.isElementContentWhitespace) return "";
            else return node.nodeValue;
        ...
    }

其中namespaceURI是DOM2增加的prop,但MSXML倒也支持。isElementContentWhitespace是DOM3增加的,用来测试文本节点是否为空(即在源xml中的无意义空白),MSXML不支持,但是由于是js,所以也不影响。但是这段代码仍旧不能按照预期运行(本身这个bug就比较隐蔽,需要拿一个较完整的xmldoc进行测试)。

我费了好大劲调试后才发现,msxml居然没有支持node接口上的常量:XXX_NODE。这样就必须直接写值如下:


    switch (node.nodeType)
    {
        case 2 /*node.ATTRIBUTE_NODE*/:
            return "{" + node.namespaceURI + "}" + node.nodeName + ": " + node.nodeValue;
            break;
        case 3 /*node.TEXT_NODE*/:
            if (node.isElementContentWhitespace) return "";  //if (node.nodeValue.match(/^/s*$/)) return "";
            else return node.nodeValue;
        ...
    }

显然,用常量的整数值不直观,对程序维护是个问题(虽然可以像上面一样加上注释)。然而,令人郁闷的是,事实上,msxml是有这组常量的:

IXMLDOMNodeType Enumerated Constants

NODE_ELEMENT(1), NODE_ATTRIBUTE(2), NODE_TEXT(3), etc.

问题是:

  1. 它不是node接口下的常量;
  2. 在动态类型的脚本环境下,没有办法引用由编译器保障的常量名(至少在SDK中没找到example);
  3. 它的命名方式跟DOM规范所列常量名不一致!

尤其可恶的是第三点,规范叫做XXX_NODE,M$偏要叫NODE_XXX,不知道M$是出于什么考虑?!微软故意违背标准来嘲笑标准和标准化组织?M$还有个扩展prop叫"nodeTypeString",返回形如'element'、'attribute'、'text'的字符串,但是就偏偏不肯行举手之劳加上标准中Node接口下所列的常量名。并且,在M$及其盟友的世界,我们丧失了自由权利,故我们也无法做任何修正或补救——除了毫无希望的去祈求M$。

Ubuntu安装libgtk-x11-2.0

为了能安装32位的lib文件,你要进行以下步骤: sudo apt-get update sudo apt-get install libgtk2.0-0:i386 libxtst6:i386...
  • myfather103
  • myfather103
  • 2016年01月18日 15:53
  • 289

一个故意不通过图灵测试的人工智能

一个故意不通过图灵测试的人工智能 人工智能很可能导致人类的永生或者灭绝,而这一切很可能在我们的有生之年发生。 上面这句话不是危言耸听...
  • ennaymonkey
  • ennaymonkey
  • 2017年10月12日 16:09
  • 4045

《我为什么熬夜?》系列之 倚天屠龙记

书中红尘与君舞,愿解其中味。
  • BLA_de
  • BLA_de
  • 2011年05月26日 22:58
  • 967

【Orz5】 2014.08.09集训总结

Today is a nice day! 这几天做了几套题现在才来一一总结。 ORZ5 vijos模拟赛 由于之前做过这个系列的比赛冥冥中就有了一些规律 导致这次分数比较高。   比赛分数...
  • ChrysanthemumZhao
  • ChrysanthemumZhao
  • 2014年08月11日 20:14
  • 547

jzoj NOIP2014提高组模拟8.9总结

一、最大配对  给出2个序列A={a[1],a[2],…,a[n]},B={b[1],b[2],…,b[n]},从A、B中各选出k个元素进行一一配对(可以不按照原来在序列中的顺序),并使得所有配对元...
  • GGSaber
  • GGSaber
  • 2014年08月11日 20:53
  • 549

Chef不爽的地方

对于chef-solo来说,cookbook的依赖关系是噩梦,因为没有chef-server,所有需要的cookbook都需要手动下载下来,尤其麻烦的还是间接的关联的依赖。另外,还有不同版本的cook...
  • puncha
  • puncha
  • 2015年05月08日 11:41
  • 1036

中国油气资源勘探新领域——非常规油气勘探

  • lizhiyong0123
  • lizhiyong0123
  • 2010年04月19日 10:12
  • 2155

POJ3254 Corn Fields(状态DP)

题目大意: 给出一个M*N的矩阵,元素为0表示这个地方不能种玉米,为1表示这个地方能种玉米,现在规定所种的玉米不能相邻,即每行或者没列不能有相邻的玉米,问一共有多少种种植方法。 思路状态DP:#i...
  • qq_35124363
  • qq_35124363
  • 2016年06月14日 10:41
  • 117

编程题目:PAT 1003. 我要通过!(20)

今天开始看了些PAT的
  • zhangyalin1992
  • zhangyalin1992
  • 2014年07月01日 16:12
  • 2257

libgtk2.0-dev 安装broken packages问题解决方法

在安装opencv的过程中,需要安装到libgtk2.0-dev,安装过程中可能会出现broken packages的问题。 输出信息如下: # apt-get install libgtk2.0...
  • u011195662
  • u011195662
  • 2017年10月31日 17:28
  • 372
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MSXML的一个令人不爽的地方——M$是故意违背标准的吗?
举报原因:
原因补充:

(最多只允许输入30个字)