PHP 服务器段处理 XML 的心得(0分)

Y

yysun

Unregistered / Unconfirmed
GUEST, unregistred user!
PHP 中 XML 处理模块 expat 只能支持US-ASCII,ISO-8859-1,UTF-8 三种编码。
http://www.php.net/manual/en/ref.xml.php
由于它的 XML 处理器并不支持中文 gb2312 和 big5 编码。于是就设想是否可以把含有
中文的 xml 和 xsl 文件先用 utf8_encode 函数编成 utf-8,送到 xslt_process 函数
中去解析,然后再把解析的结果用 utf8_decode 函数转回来?
但是,愚蠢的 PHP 到了 4.0.6,utf8_encode,utf8_decode 函数竟然只能做 ISO-8859-1
和 UTF-8 两种编码的互换。并不能保证转换 gb2312 和 utf-8。
http://www.php.net/manual/en/function.utf8-encode.php
好在 PHP 4 支持 COM,能不能通过 COM 调用 MSXML 呢?可是 MSXML 使用的是utf-16 编
码,PHP 不支持 utf-16,只能输出一堆乱码。 PHP 还不支持调用 WinAPI ......
这样,条条大路都不通“北京”了
唯一的办法,还算比较简单的办法,就是为 MSXML 做个 COM 的 wrapper,把 MSXML 输出
的 utf-16 码转换为 gb2312。于是调用这个 COM 在服务器端处理 xslt 的程序是:
<?
$transform = new COM("xmln.transformation") or die("Can't start COM");
$html = $transform->transform('c:/test/mtop.xml', 'c:/test/mtop2.xsl');
print($html);
$transform = null;
?>
另外,当 php 向 COM 传送字符串时,应该传来 WideString/BSTR,但是 php 有时候并不
能正确编码含有中文的 WideString/BSTR。 所以还得强制转换一下。
 
上述 PHP <-> COM 编码问题出现在英文 Win2000 pro,System Locale 为英文的配置下。
我把英文 Win2000 的 System Locale 设置为中文,就没有一点问题了。
可以这样:
<?
$xml = new COM("MSXML2.FreeThreadedDOMDocument") or die("Can't start MSXML3");
$xsl = new COM("MSXML2.FreeThreadedDOMDocument");
$xml->async = false;
$xsl->async = false;
$xml->load("c:/xml-java/mtop.xml");
$xsl->load("c:/xml-java/mtop2.xsl");
$html = $xml->transformNode($xsl);
$xml = null;
$xsl = null;
echo($html);
?>
 
[blue]?xml我还没想学呢,但关注!
和我一样的人必不少![/blue]
 
您也迷上php拉,呵呵。
 
如果不想用 MSXML(因为它局限于 windows 平台),而想利用 PHP 本身的 expat 的话,
设想利用 utf8_encode,utf8_decode,上面说了不成功。gutian 提醒可以使用 PHP 的
iconv 函数做编码转换。与是又设想:
变量(含中文) -> iconv -> expat -> iconv -> html(含中文)
但是,我试验的结果发现,iconv 函数转中文编码并不好,有些含中文的内容经过第一个
iconv 就变成了空串(内容丢失),很是奇怪。
另外,expat 处理比较复杂的 xslt 时,例如本站的日历,还是报出个内存错误。
所以,还是无法利用 expat。左看右看,上看下看,XML 处理器还是 MSXML 好。
 
[:D] 刚刚开始玩 PHP,长长见识。感觉 PHP 真是专门为动态网页开发而设计的呢。
直接用变量取得 query string,还有很方便的字符串替换功能等都是合成网页最需要的。
 
对了,我看了看1stclass,完全可以做delphi->html
 
delphi->html 是什么意思?
是不是用 delphi 把 xml,xsl 很成为 html?
 
使用php+xml,我觉得比较好的办法,应该是:
直接使用php的echo 根据xml的格式生成文档,如果使用expat不是很方便,对于含中文
的变量只要在接受的页面中使用iconv转换过来就行了。
至于yysun提到的有些中文经过变换变成了空字符,那应该是因为,在当时的变量是没有
经过utf-8编码的,所以出现问题。你可以跟踪一下变量。
 
我这里强调的是:服务器端处理 xml,不是生成 xml。
意思就是把 xml 和 xsl 结合生成 html 返回给客户浏览器,不是 echo 出来的 xml。
为什么服务器端处理 xml呢?因为客户端的浏览器在普及 IE6, Mozilla 1.0 以前,都
不支持 W3C 的 xslt 1.0 标准。我们论坛是技术论坛,可以要求用户安装 MSXML 3。
但是,其他很多网站不能这么干。所以服务器端处理目前是有一定意义的。
用 expat 的好处是 Linux 下也可以用。如果 Windows 平台,则首推 MSXML,因为
它的效率最好。 http://www.delphibbs.com/delphibbs/dispq.asp?lid=487130
而且其中有个 MSXML2.XSLTemplate 对象,可以把 xsl 在服务器端缓存起来,不必
每次都读文件,能提高很多效率。这个对象是其它很多 xml parser 不具备的。
$xml_str = '(一些中文)';
echo iconv("GB2312", "UTF-8", $xml_str);
有时候有内容,有时间出个空串。
 
$xml_str = '(一些中文)';
echo iconv("GB2312", "UTF-8", $xml_str);
你出现问题的是那些中文,能否告知。
 
我发现是一些特殊字符在作怪,例如:$xml_str="随便什么字加㊣,肯定显示不出";
echo iconv("GB2312", "UTF-8", $xml_str);
的结果是个空串。
 
能显示出来的也是假象,那是因为ie5有这种字符集
 
顶部