zoukankan      html  css  js  c++  java
  • php生成&解析xml

    PHP针对xml手册中列举了12个扩展,其中有几个不错的扩展:simpleXML, DOM, libxml.  前几天用到,简单介绍一下。

    如果解析一个已知结构的XML,最简答的莫过于simpleXML, 简单粗暴。下面给一个例子.

    function parseXml($xml) 
    {  
        # LIBXML_NOCDATA 选项用于解析 <![CDATA[your_data]]> 中的数据
        $parser = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        if($parser !== false) {
            return array(
                'errno' => (string)$parser->errno,
                'your_key' => (string)$parser->task_key,
                'message' => (string)$parser->message,
            );  
        }   
        return array (
            'error' => -1, 
            'your_key' => -1, 
            'message' => 'parser xml error',
        );  
    }  

    simplexml_load_string, 函数执行失败返回false;

    函数执行成功返回一个SimpleXMLElement对象,每个"xml元素"被作为成员变量,成员变量类型根据“元素包含内容”决定:

    1. 文本:string(使用时需要强制类型转换);

    2. xml元素:递归生成新的SimpleXMLElement对象。

    如果xml元素有属性,在SimpleXMLElement对象中被放在名为"[@attributes]"的成员变量中。

    如果xml格式有问题,simple_load_string返回false,且执行过程中会产生PHP warning,推荐每次使用该函数前面加"@", 即:

    $parser = @simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);


    2. 如何产生一个xml文件

    function getXml($info)
    {   
        $xmler = new XMLWriter();
        $xmler->openMemory();
        $xmler->setIndentString("    ");
        $xmler->setIndent(true);
        $xmler->startDocument('1.0', 'utf-8');
        $xmler->startElement('data');
        foreach ($info as $key => $value) {
            if(is_array($value) && !empty($value)){
                $xmler->startElement($key);
                foreach ($value as $pathMd5) {
                    $xmler->startElement("file");
                    $xmler->writeElement("path", $pathMd5['path']);
                    $xmler->writeElement("checksum", $pathMd5['checksum']);
                    $xmler->endElement();
                }   
                $xmler->endElement();
            }else {
                $xmler->writeElement($key, $value);
            }   
        }   
        $xmler->endElement();
        $xmler->endDocument();
        return $xmler->outputMemory();
    } 
    Array
    (
        [file_list] => Array
            (
                [0] => Array
                    (
                        [path] => 1.apk
                        [checksum] => be9a61bc881032bc597b4fa1dbaab3c6
                    )
    
                [1] => Array
                    (
                        [path] => 2.apk
                        [checksum] => be00eee981c1b6847f29aa8d707824f0
                    )
            )
        [domain] => softxxxx
        [service_domain] => softxx
        [remark] => CMS Request By One File.
        [alarm_group] => 
        [product] => mobile
    )
    
    <?xml version="1.0" encoding="UTF-8"?>
    <data>
        <file_list>
            <file>
                <path>1.apk</path>
                <checksum>be9a61bc881032bc597b4fa1dbaab3c6</checksum>
            </file>
            <file>
                <path>2.apk</path>
                <checksum>be00eee981c1b6847f29aa8d707824f0</checksum>
            </file>
        </file_list>
        <domain>softxxxx</domain>
        <service_domain>softxx</service_domain>
        <remark>CMS Request By One File.</remark>
        <alarm_group></alarm_group>
        <product>mobile</product>
    </data>


    上面是一个例子。

  • 相关阅读:
    霍尔逻辑(Floyd-Hoare Logic)
    解决状态空间爆炸的方法简介
    模型检测工具汇总
    模态逻辑
    linux修改apt-get 源
    Vmware宿主机无法复制粘贴内容到虚拟机中
    用tkinter.pack设计复杂界面布局
    什么是跨域,以及解决方案
    python爬虫
    JS中的原型和原型链(图解)
  • 原文地址:https://www.cnblogs.com/codesay/p/3196447.html
Copyright © 2011-2022 走看看