php

位置:IT落伍者 >> php >> 浏览文章

怎么用php解析xml文件


发布日期:2019年07月16日
 
怎么用php解析xml文件

DOMElement

DOMElement DOMDocument::createElement ( string $name [ string $value ]  )

创建节点元素

String $name节点名

String $value节点的值

添加节点

•DOMNode DOMNode::appendChild ( DOMNode $newnode )

添加子节点

DOMNode $newnode新节点

在dom操作中增删改操作必须依赖于父节点

保存

•string DOMDocument::saveXML

保存至某个字符串中

•int DOMDocument::save ( string $filename )

保存至某个文件中

String $filename文件名

删除节点

•DOMNode DOMNode::removeChild ( DOMNode $oldnode )

删除节点

DOMNode $oldnode要删除的节点

更新节点

•DOMNode DOMNode::replaceChild ( DOMNode $newnode DOMNode $oldnode )

DOMNode $newnode新节点

DOMNode $oldnode原节点

添加属性

•DOMAttr DOMElement::setAttribute( string $name string $value )

string $name 属性名

string $value 属性值

修改属性

DOMAttr DOMElement::setAttribute( string $name string $value )

string $name 属性名

string $value 属性值

删除属性

•bool DOMElement::removeAttribute ( string $name )

string $name要删除的属性名称

获取属性

•string DOMElement::getAttribute ( string $name )

string $name要获取的属性值的属性名

DOMDocument还是PHP后推出的DOM扩展的一部分可用来建立或解析html/xml目前只支持utf编码

                        代码如下                                                   

$xmlstring  = <<<XML
            <?xml  version=?>
            <document>
            <cmd attr=default>login</cmd>
            <login>imdonkey</login>
            </document>
            XML;

            

$dom  = new DOMDocument();
            $dom>loadXML($xmlstring);
            print_r(getArray($dom>documentElement));

            

function  getArray($node) {
            $array = false;

            

if ($node>hasAttributes()) {
            foreach ($node>attributes as $attr) {
            $array[$attr>nodeName] = $attr>nodeValue;
            }
            }

            

if ($node>hasChildNodes()) {
            if ($node>childNodes>length == ) {
            $array[$node>firstChild>nodeName] = getArray($node>firstChild);
            } else {
            foreach ($node>childNodes as $childNode) {
            if ($childNode>nodeType != XML_TEXT_NODE) {
            $array[$childNode>nodeName][] = getArray($childNode);
            }
            }
            }
            } else {
            return $node>nodeValue;
            }
            return $array;
            }

                        

SimpleXML

SimpleXML是PHP后提供的一套简单易用的xml工具集可以把xml转换成方便处理的对象也可以组织生成xml数据不过它不适用于包含namespace的xml而且要保证xml格式完整(wellformed)它提供了三个方法simplexml_import_domsimplexml_load_filesimplexml_load_string函数名很直观地说明了函数的作用三个函数都返回SimpleXMLElement对象数据的读取/添加都是通过SimpleXMLElement操作

                        代码如下                                                   


            $string  = <<<XML
            <?xml  version=?>
            <document>
            <cmd>login</cmd>
            <login>imdonkey</login>
            </document>
            XML;

            

$xml  = simplexml_load_string($string);
            print_r($xml);
            $login  = $xml>login;//这里返回的依然是个SimpleXMLElement对象
            print_r($login);
            $login  = (string) $xml>login;//在做数据比较时注意要先强制转换
            print_r($login);

                        

SimpleXML的优点是开发简单缺点是它会将整个xml载入内存后再进行处理所以在解析超多内容的xml文档时可能会力不从心如果是读取小文件而且xml中也不包含namespace那SimpleXML是很好的选择

XMLReader

XMLReader也是PHP之后的扩展(后默认安装)它就像游标一样在文档流中移动并在每个节点处停下来操作起来很灵活它提供了对输入的快速和非缓存的流式访问可以读取流或文档使用户从中提取数据并跳过对应用程序没有意义的记录

以一个利用google天气api获取信息的例子展示下XMLReader的使用这里也只涉及到一小部分函数更多还请参考官方文档

                        代码如下                                                   

$xml_uri  = ;
            $current  = array();
            $forecast  = array();

            

$reader  = new XMLReader();
            $reader>open($xml_uri  gbk);
            while  ($reader>read()) {
            //get current data
            if ($reader>name == "current_conditions" && $reader>nodeType ==  XMLReader::ELEMENT) {
            while($reader>read() && $reader>name != "current_conditions")  {
            $name = $reader>name;
            $value = $reader>getAttribute(data);
            $current[$name] = $value;
            }
            }

            

//get forecast data
            if ($reader>name == "forecast_conditions" && $reader>nodeType ==  XMLReader::ELEMENT) {
            $sub_forecast = array();
            while($reader>read() && $reader>name != "forecast_conditions")  {
            $name = $reader>name;
            $value = $reader>getAttribute(data);
            $sub_forecast[$name] = $value;
            }
            $forecast[] = $sub_forecast;
            }
            }
            $reader>close();

                        

XMLReader和XML  Parser类似都是边读边操作较大的差异在于SAX模型是一个“推送”模型其中分析器将事件推到应用程序在每次读取新节点时通知应用程序而使用XmlReader的应用程序可以随意从读取器提取节点可控性更好

由于XMLReader基于libxml所以有些函数要参考文档看看是否适用于你的libxml版本

               

上一篇:国外最牛的Php开源建站平台

下一篇:php.ini中文版说明