xml创建和解析问题 本帖最后由 wujun_dry 于 2010-07-13 15:24:31 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 涉及到字符串操作,比如substr, explode什么的最好用mb的函数代替,比如mb_substr, mb_spilt等等,这样处理中文会好点。具体参看http://www.php.net/manual/en/ref.mbstring.php common_fun.php:如下<?php/** * 分割路径 * @param string 节点路径 * @access public * @return array **/function explodeParth($url) { //用"/"分割路径,存在数组$part中 $part = array (); $part = explode ( "/", $url ); $coutPart = count ( $part ); $tempArr = array (); $parthArr = array (); for($i = 1; $i < $coutPart; $i ++) { //累加地址存放在数组$tempArr中 $tempArr [] = '/' . $part [$i]; //把二维数组转化成一维数组 $parthArr [$i - 1] = implode ( '', $tempArr ); } return $parthArr;}/** * //生成文件路径和xml.class文件名 * @access public * @return array **/function creatXmlName() { $now = date ( "YmdHis" ); //添加路径 $str = "E:\\workspace\\xml_relevant\\xml.class\\".$now . ".xml.class"; return $str;}?>index.php<?php$xml = new xml();$xmlStr = $xml->creatXml ( "aa", array ("aa/bank/login/id,111" , "aa/bank/login/password,222" , "aa/bank/login/auth-type,333" , "aa/bank/login/ukey,444", "aa/bank/command," ),array() );echo $xmlStr;?>这样生成xml肯定是没有问题的,但是只要我把那个参数离得111,222,333,444改成中文就报错了 <?php/** * 分割路径 * @param string 节点路径 * @access public * @return array **/function explodeParth($url) { //用"/"分割路径,存在数组$part中 $part = array (); $part = explode ( "/", $url ); $coutPart = count ( $part ); $tempArr = array (); $parthArr = array (); for($i = 1; $i < $coutPart; $i ++) { //累加地址存放在数组$tempArr中 $tempArr [] = '/' . $part [$i]; //把二维数组转化成一维数组 $parthArr [$i - 1] = implode ( '', $tempArr ); } return $parthArr;}/** * //生成文件路径和xml.class文件名 * @access public * @return array **/function creatXmlName() { $now = date ( "YmdHis" ); //添加路径 $str = "E:\\workspace\\xml_relevant\\xml.class\\".$now . ".xml.class"; return $str;}/** * @package transaction * @desc xml处理类 * @copyright eweb * @see * @author wj * @version 1.0 */class xml { private $xmlStr = ''; //xml文件 private $file = ''; /** * the original struct * * @access private * @var array */ var $_struct = array (); /** *构造函数 */ public function __construct($file = '') { if ($file != '') { $this->file = $file; } } /** *析构函数 */ function __destruct() { } /** * 获取file * @return $str xml文件路径 * @access public */ function getFilePath() { return $this->file; } /** * 创建xml * @param string 根节点 * @param array 路径数组 e.g. array("eweb/bank/login/account-id,3333",...) * @param array $att_arr 属性数组 e.g. array(arrar(a,a_att|a_att_value),...) * @return $str XML流 * @access public */ function creatXml($rootNode, $pathArr = array(), $attArr = array()) { $dom = new DOMDocument ( "1.0", "gb2312" ); header ( "Content-Type: text/plain" ); //生成根节点 $root = $dom->createElement ( $rootNode ); $dom->appendChild ( $root ); //生成文件名 $xmlName = creatXmlName (); foreach ( $pathArr as $key => $value ) { $temp = array(); //分割路径和节点的值 $temp = explode(",",$value); $this->addNode( $dom,$temp[0], $attArr, $temp[1] ); } $xmlStr = $dom->saveXML(); return $xmlStr; } /** * 添加节点 * @param string xml文件 * @param string 节点路径 * @param array 属性数组 * @param string 节点值 * @access public * @return void **/ function addNode($dom,$path, $att_arr = array(), $nodeValue = '') { //为路径字符串添加"/" if (substr ( $path, 0, 1 ) != '/') { $path = '/' . $path; } //准备工作 $path_arr = explodeParth ( $path ); $xPath = new DOMXPath ( $dom ); //添加节点 foreach ( $path_arr as $key => $pathStr ) { if ($xPath->query ( $pathStr )->length > 0) { continue; } else { //获取节点 $tempArr = explode ( "/", $pathStr ); $count = count ( $tempArr ); $currentNode = $dom->getElementsByTagName ( $tempArr [$count - 2] )->item ( 0 ); $newEle = $dom->createElement ( $tempArr [$count - 1] ); $currentNode->appendChild ( $newEle ); } } //属性 foreach ( $att_arr as $key => $value ) { $node = $dom->getElementsByTagName ( $value [0] )->item ( 0 ); // echo $node->nodeName;exit; if ($node == '') { continue; } //分开属性名称和属性的值 list ( $att_name, $att_value ) = split ( "[|]", $value [1] ); //添加属性 $att = $dom->createAttribute ( $att_name ); $node->appendChild ( $att ); $text = $dom->createTextNode ( $att_value ); $att->appendChild ( $text ); } //赋值 $currentNode = $xPath->query ( $path )->item ( 0 ); $text = $dom->createTextNode ( $nodeValue ); $currentNode->appendChild ( $text ); //保存 $xmlStr = $dom->saveXML(); }}$xml = new xml();$xmlStr = $xml->creatXml( "aa", array ("aa/bank/login/id,中文一" ,"aa/bank/login/password,中文二" ,"aa/bank/login/auth-type,中文三" ,"aa/bank/login/ukey,中文四","aa/bank/command," ),array() );echo $xmlStr;?>我在浏览器中执行,没有问题 我用zend studio的,用的360浏览器,还是报错,把中文改掉后就不出错了,是不是我这边环境有问题,辛苦了啊。让你写这么长代码 我用的Eclipse, Firefox和IE8测试 大哥,还是不行,我用Firefox,还是报错,跟php.ini等环境会不会有关系啊? php:$xml = new xml();$xmlStr = $xml->creatXml( "aa", array ("aa/bank/login/id,a" ,"aa/bank/login/password,b" ,"aa/bank/login/auth-type,c" ,"aa/bank/login/ukey,中文","aa/bank/command," ),array() );echo $xmlStr;浏览器信息:<br /><b>Warning</b>: DOMDocument::saveXML() [<a href='domdocument.savexml'>domdocument.savexml</a>]: output conversion failed due to conv error, bytes 0xD6 0xD0 0xCE 0xC4 in <b>E:\workspace\xmlStudy\testxx.php</b> on line <b>156</b><br /><br /><b>Warning</b>: DOMDocument::saveXML() [<a href='domdocument.savexml'>domdocument.savexml</a>]: encoder erroroutput conversion failed due to conv error, bytes 0xD6 0xD0 0xCE 0xC4 in <b>E:\workspace\xmlStudy\testxx.php</b> on line <b>156</b><br /><br /><b>Warning</b>: DOMDocument::saveXML() [<a href='domdocument.savexml'>domdocument.savexml</a>]: encoder erroroutput conversion failed due to conv error, bytes 0xD6 0xD0 0xCE 0xC4 in <b>E:\workspace\xmlStudy\testxx.php</b> on line <b>101</b><br /><?xml version="1.0" encoding="gb2312"?><aa><bank><login><id>a</id><password>b</password><auth-type>c</auth-type><ukey> 101 行:$xmlStr = $dom->saveXML(); 代码源文件保存为UTF-8试试还有这些是Warning信息,你可以一开始用error_reporting(E_ERROR);只显示错误信息,而屏蔽掉warning. 用utf-8可以!!大哥,太感谢了,可以安心下班了!我申请加好友了,方便加吗?太感谢了!! 大家帮看下这个文件为啥对网站有破坏性? 【求助】PHP随机生成一组数字且不重复 并赋值到input 救急!!!!php翻写delphi代码 怎么去掉php标签.. ActiveRecord下的model作用 【注意】mysql_4.1/5乱码问题专用贴 (急)100分求php安装问题 重金悬赏!!!!(奖金好商量) 小女子 求救!!我怎么得到数据库中倒数第5条 记录 得 id 请问高手,php里面链接点击后点击次数自动增加怎么实现 smarty简单的新手问题 仅有的分求助一个数据打印出如下效果,请给指点一下思路。。。
比如mb_substr, mb_spilt等等,这样处理中文会好点。具体参看http://www.php.net/manual/en/ref.mbstring.php
common_fun.php:如下
<?php
/**
* 分割路径
* @param string 节点路径
* @access public
* @return array
**/
function explodeParth($url) {
//用"/"分割路径,存在数组$part中
$part = array ();
$part = explode ( "/", $url );
$coutPart = count ( $part );
$tempArr = array ();
$parthArr = array ();
for($i = 1; $i < $coutPart; $i ++) {
//累加地址存放在数组$tempArr中
$tempArr [] = '/' . $part [$i];
//把二维数组转化成一维数组
$parthArr [$i - 1] = implode ( '', $tempArr );
}
return $parthArr;
}/**
* //生成文件路径和xml.class文件名
* @access public
* @return array
**/
function creatXmlName() {
$now = date ( "YmdHis" );
//添加路径
$str = "E:\\workspace\\xml_relevant\\xml.class\\".$now . ".xml.class";
return $str;
}
?>index.php
<?php
$xml = new xml();
$xmlStr = $xml->creatXml ( "aa",
array ("aa/bank/login/id,111" ,
"aa/bank/login/password,222" ,
"aa/bank/login/auth-type,333" ,
"aa/bank/login/ukey,444",
"aa/bank/command," ),array() );
echo $xmlStr;
?>这样生成xml肯定是没有问题的,但是只要我把那个参数离得111,222,333,444改成中文就报错了
/**
* 分割路径
* @param string 节点路径
* @access public
* @return array
**/
function explodeParth($url) {
//用"/"分割路径,存在数组$part中
$part = array ();
$part = explode ( "/", $url );
$coutPart = count ( $part );
$tempArr = array ();
$parthArr = array ();
for($i = 1; $i < $coutPart; $i ++) {
//累加地址存放在数组$tempArr中
$tempArr [] = '/' . $part [$i];
//把二维数组转化成一维数组
$parthArr [$i - 1] = implode ( '', $tempArr );
}
return $parthArr;
}/**
* //生成文件路径和xml.class文件名
* @access public
* @return array
**/
function creatXmlName() {
$now = date ( "YmdHis" );
//添加路径
$str = "E:\\workspace\\xml_relevant\\xml.class\\".$now . ".xml.class";
return $str;
}/**
* @package transaction
* @desc xml处理类
* @copyright eweb
* @see
* @author wj
* @version 1.0
*/
class xml {
private $xmlStr = '';
//xml文件
private $file = '';
/**
* the original struct
*
* @access private
* @var array
*/
var $_struct = array ();
/**
*构造函数
*/
public function __construct($file = '') {
if ($file != '') {
$this->file = $file;
}
} /**
*析构函数
*/
function __destruct() {
} /**
* 获取file
* @return $str xml文件路径
* @access public
*/
function getFilePath() {
return $this->file;
}
/**
* 创建xml
* @param string 根节点
* @param array 路径数组 e.g. array("eweb/bank/login/account-id,3333",...)
* @param array $att_arr 属性数组 e.g. array(arrar(a,a_att|a_att_value),...)
* @return $str XML流
* @access public
*/
function creatXml($rootNode, $pathArr = array(), $attArr = array()) {
$dom = new DOMDocument ( "1.0", "gb2312" );
header ( "Content-Type: text/plain" );
//生成根节点
$root = $dom->createElement ( $rootNode );
$dom->appendChild ( $root ); //生成文件名
$xmlName = creatXmlName ();
foreach ( $pathArr as $key => $value ) {
$temp = array();
//分割路径和节点的值
$temp = explode(",",$value);
$this->addNode( $dom,$temp[0], $attArr, $temp[1] );
}
$xmlStr = $dom->saveXML();
return $xmlStr;
}
/**
* 添加节点
* @param string xml文件
* @param string 节点路径
* @param array 属性数组
* @param string 节点值
* @access public
* @return void
**/
function addNode($dom,$path, $att_arr = array(), $nodeValue = '') {
//为路径字符串添加"/"
if (substr ( $path, 0, 1 ) != '/') {
$path = '/' . $path;
}
//准备工作
$path_arr = explodeParth ( $path );
$xPath = new DOMXPath ( $dom );
//添加节点
foreach ( $path_arr as $key => $pathStr ) {
if ($xPath->query ( $pathStr )->length > 0) {
continue;
} else {
//获取节点
$tempArr = explode ( "/", $pathStr );
$count = count ( $tempArr );
$currentNode = $dom->getElementsByTagName ( $tempArr [$count - 2] )->item ( 0 );
$newEle = $dom->createElement ( $tempArr [$count - 1] );
$currentNode->appendChild ( $newEle );
}
}
//属性
foreach ( $att_arr as $key => $value ) {
$node = $dom->getElementsByTagName ( $value [0] )->item ( 0 );
// echo $node->nodeName;exit;
if ($node == '') {
continue;
}
//分开属性名称和属性的值
list ( $att_name, $att_value ) = split ( "[|]", $value [1] );
//添加属性
$att = $dom->createAttribute ( $att_name );
$node->appendChild ( $att );
$text = $dom->createTextNode ( $att_value );
$att->appendChild ( $text );
}
//赋值
$currentNode = $xPath->query ( $path )->item ( 0 );
$text = $dom->createTextNode ( $nodeValue );
$currentNode->appendChild ( $text );
//保存
$xmlStr = $dom->saveXML();
}
}$xml = new xml();
$xmlStr = $xml->creatXml( "aa",
array ("aa/bank/login/id,中文一" ,
"aa/bank/login/password,中文二" ,
"aa/bank/login/auth-type,中文三" ,
"aa/bank/login/ukey,中文四",
"aa/bank/command," ),array() );
echo $xmlStr;?>
我在浏览器中执行,没有问题
我用zend studio的,用的360浏览器,还是报错,把中文改掉后就不出错了,是不是我这边环境有问题,辛苦了啊。让你写这么长代码
大哥,还是不行,我用Firefox,还是报错,跟php.ini等环境会不会有关系啊?
$xml = new xml();
$xmlStr = $xml->creatXml( "aa",
array ("aa/bank/login/id,a" ,
"aa/bank/login/password,b" ,
"aa/bank/login/auth-type,c" ,
"aa/bank/login/ukey,中文",
"aa/bank/command," ),array() );
echo $xmlStr;浏览器信息:
<br />
<b>Warning</b>: DOMDocument::saveXML() [<a href='domdocument.savexml'>domdocument.savexml</a>]: output conversion failed due to conv error, bytes 0xD6 0xD0 0xCE 0xC4 in <b>E:\workspace\xmlStudy\testxx.php</b> on line <b>156</b><br />
<br />
<b>Warning</b>: DOMDocument::saveXML() [<a href='domdocument.savexml'>domdocument.savexml</a>]: encoder erroroutput conversion failed due to conv error, bytes 0xD6 0xD0 0xCE 0xC4 in <b>E:\workspace\xmlStudy\testxx.php</b> on line <b>156</b><br />
<br />
<b>Warning</b>: DOMDocument::saveXML() [<a href='domdocument.savexml'>domdocument.savexml</a>]: encoder erroroutput conversion failed due to conv error, bytes 0xD6 0xD0 0xCE 0xC4 in <b>E:\workspace\xmlStudy\testxx.php</b> on line <b>101</b><br />
<?xml version="1.0" encoding="gb2312"?>
<aa><bank><login><id>a</id><password>b</password><auth-type>c</auth-type><ukey>
error_reporting(E_ERROR);
只显示错误信息,而屏蔽掉warning.
用utf-8可以!!大哥,太感谢了,可以安心下班了!
我申请加好友了,方便加吗?太感谢了!!