本帖最后由 wujun_dry 于 2010-07-13 15:24:31 编辑

解决方案 »

  1.   

    涉及到字符串操作,比如substr, explode什么的最好用mb的函数代替,
    比如mb_substr, mb_spilt等等,这样处理中文会好点。具体参看http://www.php.net/manual/en/ref.mbstring.php
      

  2.   


    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改成中文就报错了
      

  3.   

    <?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;?>
    我在浏览器中执行,没有问题
      

  4.   


    我用zend studio的,用的360浏览器,还是报错,把中文改掉后就不出错了,是不是我这边环境有问题,辛苦了啊。让你写这么长代码
      

  5.   

    我用的Eclipse, Firefox和IE8测试
      

  6.   


    大哥,还是不行,我用Firefox,还是报错,跟php.ini等环境会不会有关系啊?
      

  7.   

    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>
      

  8.   

    101 行:$xmlStr = $dom->saveXML();
      

  9.   

    代码源文件保存为UTF-8试试还有这些是Warning信息,你可以一开始用
    error_reporting(E_ERROR);
    只显示错误信息,而屏蔽掉warning.
      

  10.   


    用utf-8可以!!大哥,太感谢了,可以安心下班了!
    我申请加好友了,方便加吗?太感谢了!!