AJAX应用中怎样确保得到XML DOM对象?

使返回的xml数据能够作为XML DOM对象来用,需要这么几件事情:

1、服务器返回的头部信息需要 设置 Content-Type: text/xml

2、返回的xml结构中需要有个documentElmement节点,这样可以保证各浏览器之间的兼容。举例来说:
(建议你客户端和服务器端全部使用UTF-8编码,减少因编码问题引起的莫名奇妙问题)

<?xml version="0.1" encoding="UTF-8"?>
<res>
  <data><![CDATA[abc123]]></data>
</res>

这里 res就是documentElement

3、以上面的xml为例,客户端收到responseXML对象后,首先

var doc = responseXML.documentElement; //得到 res,这步很重要
var d = doc.getElementsByTagName('data')[0];
alert( getNodeValue(d) ); //  show 'abc123'

//----------------------
function getNodeValue(node)
{
  if(node && node.hasChildNodes()){
    //return node.firstChild.nodeValue;
    var s="";
    //Mozilla has many textnodes with a size of 4096 chars
    // each instead of one large one.
    //They all need to be concatenated.
    for(var j=0;j<node.childNodes.length;j++){
      s+=new String(node.childNodes.item(j).nodeValue);
    }
    return s;
  }else
    return "";
}

评论(1)

生成XML文档时CDATA段中含有]]>怎么办?

这是个有意思的问题,包含在CDATA标签<![CDATA[ ... ]]>之间的内容会被XML解析器忽略,这样就不需要对内容中出现的 <>&等字符进行转义(&lt;&gt;&amp;)。

但是内容中一旦出现]]>,就会导致XML解析失败,因为CDATA不允许嵌套。
解决的办法不止一个,我采用把 ]]>拆开放入两个CDATA中的简单办法,下面是PHP的实现:

function XmlCDATAStr($s)
{
  $a = explode(']]>',$s);
  return XmlSafeStr(implode(']]]]><![CDATA[>',$a));
}

上面用到了前文提到的XmlSafeStr()函数来过滤非法的XML字符。

有更好的办法请一定告诉我 :)

评论(15)

过滤XML中遇到的非法字符

XML规范规定的非法字符有:

/*
  0x00 - 0x08
  0x0b - 0x0c
  0x0e - 0x1f
*/

含有这些字符的XML文档在解析的时候就会报错,因此输出的时候需要进行过滤。

PHP的实现:

function XmlSafeStr($s)
{
  /*
    0x00 - 0x08
    0x0b - 0x0c
    0x0e - 0x1f
  */
  return preg_replace("/[x00-x08x0b-x0cx0e-x1f]/",'',$s);
}

当然,如果有现成的PHP模块提供类似的功能,请大家告诉我 :P

评论(0)

· Next entries »