安静
PHP技术博客

100127 php 解析xml

前几天老大让我做了个东西  具体是这样的  

原画 3D 组 画出来的人物数据 是无法直接导入到公司现在版本的游戏引擎 需要 做一些转换 超复杂

3d 原文件通过 软件 hacked 成xml->text的游戏引擎识别的数据格式

整体过程就用了简单的一个 simplexml解析 具体过程  加一些加工

hack 以后出来的 xml文件 包含了 2部分

*.mesh.xml
面部结构文件

*.skeleton.xml
节点动画文件

转出来的格式比较复杂  甚至是说我见过最恶心的格式…

好吧 不说其hack出来的内容有多恶心了 讲下工作具体思路吧

首先给的文件比较多 光一个人物就有10来个文件 实际上还是切割处理过的 不然。。文件会较大 解析难度更大。。甚至到吐血程度的困难

为了以后不用劳烦我帮他们转代码 我想还是做一套完成的工具给他们使用 这样以后就不用麻烦偶了

//返回目录集合 这里我直接做了 解析 和写入的工作
function listFiles ($dir)
{
    //打开目录
    $handle = opendir($dir);
    //阅读目录
    while (false != ($file = readdir($handle))) {
        //列出所有文件并去掉’.’和’..’
        if ($file != ‘.’ & $file != ‘..’) {
            //所得到的文件名是否是一个目录
            if (is_dir(“$dir/$file”)) {
                //列出目录下的文件
                listFiles(“$dir/$file”);
            } else {
                //如果是文件则打开该文件
                $fp = fopen(“$dir/$file”, “r”);
                //阅读文件内容
                $data = fread($fp, filesize(“$dir/$file”));
                if ($data)
                    $file_array[] = “$dir/$file”;
                    //输出结果
                while (list ($key, $value) = each($file_array)) {
               //正则取出文件后缀  符合的 则进行函数操作 解析写入文档
                    //echo $value;
                    $str = preg_match_all(‘/<*.mesh.xml/’, $value, $m);
                    if ($str == 1) {
                        $logtext = rewritexml($value);
                        savetext($value, $logtext);
                    }
                    $str = preg_match_all(‘/<*.skeleton.xml/’, $value, $m);
                    if ($str == 1) {
                        $logtext = rewritexml_skeleton($value);
                        savetext($value, $logtext);
                    }
                }
            }
        }
    }
}

//内容写入 原谅我的懒惰 没有去判断 返回值实际上这只是个工具 内部使用 我就没有那么逻辑很谨慎了
function savetext ($name, $logtext)
{
    /**
     * @Author:ZhangQingYue
     * @Description: 方法介绍
     * @FirstCreatDate: 2010-1-22
     * @param : nuserid – 用户ID
     */
    $filename = $name . “.txt”;
    $fp = fopen($filename, “a”);
    flock($fp, LOCK_EX);
    fwrite($fp, $logtext);
    flock($fp, LOCK_UN);
    fclose($fp);
}

//解析XML 返回解析以后的内容
function rewritexml ($filepatch)
{
    /**
     * @Author:ZhangQingYue
     * @Description: 方法介绍
     * @FirstCreatDate: 2010-1-22
     * @param : nuserid – 用户ID
     */
    $xml = simplexml_load_file($filepatch); //加载xml
    $faces = $xml->submeshes->submesh->faces->face; //获取节点
    $geometry = $xml->submeshes->submesh->geometry->vertexbuffer;
    $boneassignments = $xml->submeshes->submesh->boneassignments->vertexboneassignment;
    $str = array();
    foreach ($geometry as $geometry_single) {
        //有for 循环 内存溢出bug 只能用 foreach 拼接   http://bugs.php.net/bug.php?id=41582
        $i = 0;
        foreach ($geometry_single as $vertex) {
            if ($vertex->position) {
                $str[$i][“p”] = $vertex->position[‘x’] . “,” . $vertex->position[‘y’] . “,” . $vertex->position[‘z’] . “;”;
            }
            if ($vertex->normal) {
                $str[$i][“n”] = $vertex->normal[‘x’] . “,” . $vertex->normal[‘y’] . “,” . $vertex->normal[‘z’] . “;”;
            }
            if ($vertex->colour_diffuse) {
                $strx = $vertex->colour_diffuse[‘value’] . “”;
                $strx = str_replace(‘ ‘, ‘,’, $strx);
                $str[$i][“c”] = $strx . “;”;
            }
            if ($vertex->texcoord) {
                $str[$i][“t”] = $vertex->texcoord[‘u’] . “,” . $vertex->texcoord[‘v’] . “;”;
            }
            $i ++;
        }
    }
    $logtext= “dingdianshumu:” . sizeof($str) . “\t\n”;
    //sizeof($str)
    for ($x = 1; $x < sizeof($str); $x ++) {
        $logtext.=$str[$x][“p”] . $str[$x][“n”] . $str[$x][“c”] . $str[$x][“t”] . “\t\n”;
    }
    $logtext.= “\t\n\t\nmianshumu:” . sizeof($faces) . “\t\n\t\n”;
    foreach ($faces as $face) {
       $logtext.= $face[‘v1’] . “,” . $face[‘v2’] . “,” . $face[‘v3’] . “\t\n”;
    }
     $logtext.=”\t\n\t\ngugeyingxiang\t\n\t\n”;
    foreach ($boneassignments as $boneassignment) {
        $logtext.= $boneassignment[‘vertexindex’] . “,” . $boneassignment[‘boneindex’] . “,” . $boneassignment[‘weight’] . “\t\n”;
    }
    return $logtext;
}

//最终实例调用-_- so sigh~ 花费了 一个下午才做完的工作  
$dir = “./”;
listFiles($dir);

源码下载

赞(0) 打赏
未经允许不得转载:AJ's Blog » 100127 php 解析xml
分享到: 更多 (0)

评论 6

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #-49

    依然很黑!

    上善若水11年前 (2010-01-27)
  2. #-48

    感觉好复杂哦

    妮裳神话11年前 (2010-01-27)
  3. #-47

    学习了,新年愉快,讨论的很专业

    土狼妹妹11年前 (2010-01-28)
  4. #-46

    不复杂怎么混饭吃呢-_- lol

    可 乐烟11年前 (2010-01-29)
  5. #-45

    这眼睛怎么看怎么想熊猫,呵呵,新年快乐。

    ipple11年前 (2010-02-14)
  6. #-44

    这阵子总来blog.80aj.com了,域名都背过了…我自己的都没背过呢…

    golf cart bags10年前 (2010-10-05)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏