zoukankan      html  css  js  c++  java
  • PHP读写XML文件的四种方法

    PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写、DOMDocument读写、

    XMLWrite写和XMLReader读、SimpleXML读写,本文将依次对这四种方法进行介绍。
    
      介绍之前首先对本文例子使用的数据和文件进行说明。本文写XML文件的例子都是从MySQL中读取数据然后
    
    写入到XML文件中,读XML文件的例子都是从XML文件中读取数据后组装成数组的格式,数组中每个元素对应数
    
    据库中的一条记录。
    
    MySQL中的数据:

    XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?xml version="1.0" encoding="utf8"?>
    <studentcareer>
      <period>
        <starttime>2000</starttime>
        <endtime>2002</endtime>
        <school>培新小学</school>
      </period>
      <period>
        <starttime>2002</starttime>
        <endtime>2006</endtime>
        <school>览表东阳学校</school>
      </period>
      <period>
        <starttime>2006</starttime>
        <endtime>2009</endtime>
        <school>惠来慈云实验中学</school>
      </period>
      <period>
        <starttime>2009</starttime>
        <endtime>2012</endtime>
        <school>惠来一中</school>
      </period>
      <period>
        <starttime>2012</starttime>
        <endtime>2016</endtime>
        <school>华南师范大学</school>
      </period>
    </studentcareer>

    读取XML文件后组装成的数据格式:

    下面的例子使用的数据、文件都是以上所列数据、文件,介绍各个方法时不再赘述,直接贴代码。

    一、PHP字符串方式读写XML文件:

    1. 字符串方式写XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    /**
    * function:使用字符串方式写XML文件
    * author:JetWu
    * date:2016.12.03
    **/
    $mysqli = mysqli_connect('localhost''root''123456''wjt');
    if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());
     
    $sql 'select * from study order by starttime';
    $res = mysqli_query($mysqli$sql);
    $study array();
    while($row = mysqli_fetch_array($res)) {
        $study[] = $row;
    }
    //XML标签配置
    $xmlTag array(
        'starttime',
        'endtime',
        'school'
    );
     
    $str "<studentcareer> ";
    foreach($study as $v) {
        $str .= " <period> ";
        foreach($xmlTag as $x) {
            $str .= " <".$x.">" $v[$x] . "</".$x."> ";
        }
        $str .= " </period> ";
    }
    $str .= '</studentcareer>';
     
    $file './write_str.xml';
    file_put_contents($file$str);

    2. 字符串方式读XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    /**
    * function:使用字符串方式读XML文件
    * author:JetWu
    * date:2016.12.03
    **/
    $file './write_str.xml';
    $con file_get_contents($file);
     
    //XML标签配置
    $xmlTag array(
        'starttime',
        'endtime',
        'school'
    );
     
    $arr array();
    foreach($xmlTag as $x) {
        preg_match_all("/<".$x.">.*</".$x.">/"$con$temp);
        $arr[] = $temp[0];
    }
    //去除XML标签并组装数据
    $data array();
    foreach($arr as $key => $value) {
        foreach($value as $k => $v) {
            $a explode($xmlTag[$key].'>'$v);
            $v substr($a[1], 0, strlen($a[1])-2);
            $data[$k][$xmlTag[$key]] = $v;
        }
    }
    echo '<pre>';
    print_r($data);

    二、DOMDocument读写XML文件

    1. DOMDocument写XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
    /**
    * function:DOMDocument写XML文件
    * author:JetWu
    * date:2016.12.03
    **/
    $mysqli = mysqli_connect('localhost''root''123456''wjt');
    if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());
     
    $sql 'select * from study order by starttime';
    $res = mysqli_query($mysqli$sql);
    $study array();
    while($row = mysqli_fetch_array($res)) {
        $study[] = $row;
    }
    //XML标签配置
    $xmlTag array(
        'starttime',
        'endtime',
        'school'
    );
     
    $dom new DOMDocument('1.0''utf8');
    $dom->formatOutput = true;
    $studentcareer $dom->createElement('studentcareer');
    $dom->appendChild($studentcareer);
    foreach($study as $s) {
        $period $dom->createElement('period');
        $studentcareer->appendChild($period);
        foreach($xmlTag as $x) {
            $element $dom->createElement($x);
            $period->appendChild($element);
            $text $dom->createTextNode($s[$x]);
            $element->appendChild($text);
        }
    }
    $dom->save('./write_dom.xml');

    2. DOMDocument读XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
    /**
    * function:DOMDocument读XML文件
    * author:JetWu
    * date:2016.12.03
    **/
    //XML标签配置
    $xmlTag array(
        'starttime',
        'endtime',
        'school'
    );
    $dom new DOMDocument();
    $dom->load('./write_dom.xml');
    $periods $dom->getElementsByTagName('period');
    $study array();
    foreach($periods as $k => $p) {
        foreach($xmlTag as $x) {
            $node $p->getElementsByTagName($x);
            $study[$k][$x] = $node->item(0)->nodeValue;
        }
    }
    echo '<pre>';
    print_r($study);

    三、XMLWriter和XMLReader读写XML文件

    1. XMLWriter写XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?php
    /**
    * function:XMLWriter写XML文件
    * author:JetWu
    * date:2016.12.03
    **/
    $mysqli = mysqli_connect('localhost''root''123456''wjt');
    if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());
     
    $sql 'select * from study order by starttime';
    $res = mysqli_query($mysqli$sql);
    $study array();
    while($row = mysqli_fetch_array($res)) {
        $study[] = $row;
    }
     
    //XML标签配置
    $xmlTag array(
        'starttime',
        'endtime',
        'school'
    );
     
    $xml new XMLWriter();
    $xml->openUri('./write_WR.xml');
    $xml->setIndentString('  ');//设置缩进格式化使用的符号
    $xml->setIndent(true);
    $xml->startDocument('1.0''utf8');
    $xml->startElement('studentcareer');
    foreach($study as $s) {
        $xml->startElement('period');
        foreach($xmlTag as $x) {
            $xml->startElement($x);
            $xml->text($s[$x]);
            $xml->endElement();
        }
        $xml->endElement();
    }
    $xml->endElement();
    $xml->endDocument();
    $xml->flush();

    2. XMLReader读XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    /**
    * function:XMLReader读XML文件
    * author:JetWu
    * date:2016.12.03
    **/
    //XML标签配置
    $xmlTag array(
        'starttime',
        'endtime',
        'school'
    );
    $xml new XMLReader();
    $xml->open('./write_WR.xml');
    $study array();
    $count = 0;//记录数:方便组装数据
    $name '';
    while($xml->read()) {
        $n $xml->name;
        if($xml->nodeType == XMLReader::ELEMENT) {
            if($n == 'period') {//开始下一条记录的读取
                $count ++;
            else if(in_array($n$xmlTag)) {//记录需要获取文本值的标签名
                $name $n;
            }
        else if($xml->nodeType == XMLReader::TEXT) {
            if(in_array($name$xmlTag)) {
                $study[$count][$name] = $xml->value;
            }
        }
    }
    $xml->close();
    echo '<pre>';
    print_r($study);

    四、SimpleXML读写XML文件

    1. SimpleXML写XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
    /**
    * function:SimpleXML写XML文件
    * author:JetWu
    * date:2016.12.03
    **/
    $mysqli = mysqli_connect('localhost''root''123456''wjt');
    if(mysqli_connect_errno()) die('database connect fail:' . mysqli_connect_error());
     
    $sql 'select * from study order by starttime';
    $res = mysqli_query($mysqli$sql);
    $study array();
    while($row = mysqli_fetch_array($res)) {
        $study[] = $row;
    }
     
    //XML标签配置
    $xmlTag array(
        'starttime',
        'endtime',
        'school'
    );
    $xml new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><studentcareer />');
    foreach($study as $s) {
        $period $xml->addChild('period');
        foreach($xmlTag as $x) {
            $period->addChild($x$s[$x]);
        }
    }
    $xml->asXml('./write_sim.xml');//输出XML文件(没有格式化)

    2. SimpleXML读XML文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    /**
    * function:SimpleXML读XML文件
    * author:JetWu
    * date:2016.12.03
    **/
    //XML标签配置
    $xmlTag array(
        'starttime',
        'endtime',
        'school'
    );
    $study array();
    $xml = simplexml_load_file('./write_sim.xml');
    foreach($xml->children() as $period) {
        $study[] = get_object_vars($period);//获取对象全部属性,返回数组
    }
    echo '<pre>';
    print_r($study);
    总结:这四种方法中,字符串的方式是最原始的方法。SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储
    
    为树的数据结构中,需要把整个文档都加载到内存中才能工作,所以当处理大型XML文档的时候,性能会剧减。XMLReader
    
    则是属于基于流的解析器,它不会一次把整个文档加载到内存中,而是每次分别读取其中的一个节点并允许实时与之交互,这种
    
    方式效率高,而且占内存少。
  • 相关阅读:
    Oracle异常处理—ORA-12514:监听程序当前无法识别连接描述符中请求的服务
    plsql永久注册码
    spring boot 大文件上传实现方式(二)
    spring boot 大文件上传实现方式(一)
    正则表达式的应用
    正则表达式汇总
    爬虫数据提取——正则表达式
    爬虫基础URL
    Linux环境搭建-在虚拟机中安装Centos7.0(超详细版)
    在虚拟机中安装Centos7.0
  • 原文地址:https://www.cnblogs.com/lucky-man/p/6207759.html
Copyright © 2011-2022 走看看