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>


上面是一个例子。

 

posted @ 2013-07-17 18:59  代码会说话  阅读(379)  评论(0编辑  收藏  举报