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>


    上面是一个例子。

  • 相关阅读:
    Centos安装mysql
    @autowired注解报错原因及解决办法
    注解@Resource与@Autowired的区别
    SpringBoot三种获取Request和Response的方法
    oss 上传图片、下载 中文名称
    git tags 和 Branches的区别是什么呀,什么时候应该创建一个Tag?
    git使用命令,git checkout -b a 与 git branch a区别
    PostgreSQL-With子句实现递归
    redisson锁 tryLock的使用及正确用法
    mysql any 和in 函数的使用
  • 原文地址:https://www.cnblogs.com/codesay/p/3196447.html
Copyright © 2011-2022 走看看