轻量级的xml文档生成类

原创 2006年06月07日 08:51:00
<?
/**
* 轻量级XML文档生成类(非dom)
* author:  q3boy <q3boy@sina.com>
* version: v0.1 aplha
* update:  2003/9/8
* 支持Element/CDATA/Declare/attribute/Comment,可选择是否包含换行和缩进
*/
class xml {

    /** 元素名 */
    var $name;
    /** 元素值 */
    var $value;
    /** 元素类型 */
    var $type;
    /** 元素属性 */
    var $attrib;
    /** XML声明 */
    var $declare;
    /** 是否缩进换行 */
    var $space;

    /** 构造函数 */
    function xml($name='',$value='') {
        $this->name = $name;
        $this->value = $value;
        $this->declare = array();
        $this->setTypes('Element');
        $this->setAttrib(array());
        $this->setSpace(false);
    }

    /** 设置元素类型 */
    function setTypes($type) {
        $this->type = $type;
    }

    /** 设置是否缩进换行 */
    function setSpace($space) {
        $this->space = $space;
    }

    /** 设置元素属性 */
    function setAttrib($name,$value='') {
        if(is_array($name)) {
            $this->attrib = array_merge($this->attrib,$name);
        }else {
            $this->attrib[$name] = $value;
        }
    }

    /** 添加子元素 */
    function &addElement($name='',$value='') {
        if(!is_array($this->value)) {
            $this->value = array();
        }
        $xml = new xml($name,$value);
        $xml->setSpace($this->space);
        $this->value[] = &$xml;
        return $this->value[sizeof($this->value)-1];
    }

    /** 添加CDATA数据 */
    function &addCDATA($name='',$value='') {
        if(!is_array($this->value)) {
            $this->value = array();
        }
        $xml = new xml($name,$value);
        $xml->setSpace($this->space);
        $xml->setTypes('CDATA');
        $this->value[] = &$xml;
        return $this->value[sizeof($this->value)-1];
    }

    /** 添加XML声明 */
    function &addDeclare($name='',$value='') {
        if(!is_array($this->declare)) {
            $this->value = array();
        }
        $xml = new xml($name,$value);
        $xml->setSpace($this->space);
        $xml->setTypes('Declare');
        $this->declare[] = &$xml;
        return $this->declare[sizeof($this->value)-1];
    }

    /** 添加注释文本 */
    function &addComment($content='') {
        if(!is_array($this->value)) {
            $this->value = array();
        }
        $xml = new xml($content);
        $xml->setSpace($this->space);
        $xml->setTypes('Comment');
        $this->value[] = &$xml;
        return $this->value[sizeof($this->value)-1];
    }

    /** 返回xml文本流 */
    function toString($itm='',$layer=0) {
        if(!is_object($itm))$itm = &$this;
        /* 换行/缩进 */
        if($this->space) {
            $tab = str_repeat("    ",$layer);
            $tab1 = str_repeat("    ",$layer+1);
            $br = "
";
        }
        /* XML声明 */
        for($i=0; $i<sizeof($itm->declare); $i++) {
            $out = "<?".$itm->declare[$i]->name;
            foreach($itm->declare[$i]->attrib as $key=>$val) {
                $out .=" $key="".$this->encode($val).""";
            }
            $out.="?>$br";
        }
        /* 文档树 */
        switch($itm->type) {
            case 'CDATA':
            case 'Element':
                $out .= $tab.'<'.$itm->name;
                foreach($itm->attrib as $key=>$val) {
                    $out .=" $key="".$this->encode($val).""";
                }
                if(is_array($itm->value)) {
                    $out .='>'.$br;
                    for($i=0; $i<sizeof($itm->value); $i++) {
                        $out .=$this->toString(&$itm->value[$i],$layer+1);
                    }
                    $out .= $tab.'</'.$itm->name.'>'.$br;

                }elseif($itm->value!='') {
                    $out .='>'.$br.$this->encode($itm->value,$itm->type,$tab1,$br).$br.$tab.'</'.$itm->name.'>'.$br;
                }else {
                    $out .=' />'.$br;
                }
                break;
            case 'Comment':
                $out .= '<!--'.$br.$itm->name.$br.'-->'.$br;
                break;
        }
        return $out;
    }

    /** 生成xml文件 */
    function toFile($file) {
        $fp = fopen($file,'w');
        fwrite($fp,trim($this->toString()));
        fclose($fp);
    }

    /** 实体引用转换 */
    function encode($content,$type='Element',$tab1='',$br='') {
        if($type=='Element') {
            return $tab1.strtr($content,array('>'=>'&lt;','<'=>'&gt;','&'=>'&amp;','"'=>'&quot;',"'"=>'&apos;'));
        }elseif($type=='CDATA') {
            return '<![CDATA['.$br.str_replace(']]>',']] >',$content).$br.']]>';
        }
    }
}


/* example */

/* 对象初始化 */
$xml = new xml('test');

/* 允许输出换行/缩进 */
$xml->setSpace(true);

/* 设置xml声明 */
$d = &$xml->addDeclare('xml');
$d->setAttrib("version","1.0");

/* 设置xml文档树 */
$xml1 = &$xml->addElement('test1','test1-1');
$xml1->addElement('test2','test2-1');
$x2 = &$xml1->addElement('test3','test2-2');
$x2->setAttrib("asd","1&23<>4'"23");

$xml1->addElement('test4','test2-3');
$xml->addElement('test455','taadsfa<><>fdsadest2-3');
$xml->addComment('adsfadsf');//注释
/* CDATA数据 */
$xml->addCDATA('cdname','dflkgmsglsd
f]gl
sdgl
asgl
sf"&ldgsldkfg]]>
sldf
gsdfgsD?FG>S<DG>S?D<Fgsd]fglsg>>');
$x1 = &$xml->addElement('test455');
$x1->setAttrib("asd",123423);
$xml->setAttrib(array("asd"=>123,'sdfgdfg'=>2341));
$xml->setAttrib("asd",123423);
/* 输出文件 */
$xml->tofile('aaa.xml');
?>

使用 adr 轻松创建 “程序员友好” 的轻量级文档

是的,我又写了一个 markdown 工具,它对我来说非常有用。上下文在一周里,我看到了一个名为 “轻量级架构决策记录” 的技术实践。在看到了一个简单的示例之后,并阅读了文章《架构决策记录》之后,我开...
  • j01G58UC80251
  • j01G58UC80251
  • 2017年11月27日 00:00
  • 172

使用xml文件生成在线帮助文档

目前,很多系统或工具都会提供相应的在线帮助文档,
  • vipshop_ebs
  • vipshop_ebs
  • 2014年09月18日 14:15
  • 680

XML生成Java类代码

最近对接第三方公司接口,对方调用我们http接口是在request的body里传的整个的xml字符串,xml的定义是第三方公司定义的。我接到字符串后要对xml内容解析,解析出自己要的业务数据。之前xm...
  • zhengshg
  • zhengshg
  • 2017年03月22日 14:23
  • 1500

自动生成代码的chm格式帮助文档

在Visual Studio下编程,有两个很方便的生成chm帮助文档的工具。它们就是Sandcastle Help File Builder 和Sandcastle。Sandcastle Help F...
  • sanqima
  • sanqima
  • 2015年03月26日 18:02
  • 2761

C#生成、解析xml文件以及处理报错原因

简单的介绍一下生成XML文件以及解析,因为有些数据不一定放到数据库,减少链接数据库        用xml还是比较好些。如果遇到问题也就是解析时报错,对于解析,可以选择用ie浏览器进行验证    ...
  • lilinoscar
  • lilinoscar
  • 2014年03月11日 18:02
  • 5265

C# 创建XML文档

有些时候我们需要生成一个xml文档作为数据交换的容器。当然我们用拼接字符串的方法来进行构建xml,但是这种方法虽然简单有效,但是如果xml文档结构过于复杂,拼接字符串会让人眼花缭乱。这时候就需要C#给...
  • guwei4037
  • guwei4037
  • 2013年12月11日 19:41
  • 6776

在java 用xml模板通过freemarker生成word文档

先贴一段代码,这是根据网上的代码稍作修改后可以直接运行 需要下载freemarker.jar maven的项目直接引用 org.freemarker freemarker 2.3.23 ...
  • jr_soft
  • jr_soft
  • 2016年07月20日 14:54
  • 1335

通过JAXB注解,根据java类生成xml内容

1.         什么是JAXB?     Java  Architecture for XML Binding (JAXB)是一个业界的标准,是一项可以根据XML Schema产生Java类的...
  • b671900
  • b671900
  • 2014年04月28日 14:41
  • 1679

通过xml生成word文档

Xml生成word总结    使用xml生成word的基本步骤在《使用xslt转化xml数据形成word文档导出.doc》中说明比较清楚了。但是其中的细节并未说到,因此自己折腾了两天总算成功了。以下是...
  • hai200501019
  • hai200501019
  • 2015年01月20日 01:18
  • 1109

第4章 XML 聚类研究

4.1 概述 将自动聚类技术用于Web信息检索结果的类别划分,将检索结果依据内容划分为相应的类别,具有相似特征的文档放在同一组,以便于用户缩小查找范围。 4.2 聚类分析基础 所谓聚类就是将数据...
  • u012889441
  • u012889441
  • 2017年04月10日 22:15
  • 300
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:轻量级的xml文档生成类
举报原因:
原因补充:

(最多只允许输入30个字)