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>
上面是一个例子。