美工统筹SEO,为企业电子商务营销助力!
php剖析xml 的四种简略体例(附实例)
一佰互联网站建造(www.taishanly.com) 宣布日期 2020-04-27 10:44:10 阅读数: 129
XML处置是开辟历程中常常碰到的,PHP对其也有很丰硕的撑持,本文只是对此中某几种剖析手艺做扼要申明,包罗:Xml parser, SimpleXML, XMLReader, DOMDocument。
1。 XML Expat Parser:
XML Parser操纵Expat XML剖析器。Expat是一种基于事务的剖析器,它把XML文档视为一系列事务。当某个事务产生时,它挪用一个指定的函数处置它。Expat是无考证的剖析器,疏忽任何链接到文档的DTD。可是,若是文档的情势不好,则会以一个毛病动静竣事。因为它基于事务,且无考证,Expat具备疾速并合适web操纵法式的特征。
XML Parser的上风是机能好,因为它不是将全数xml文档载入内存后再处置,而是边剖析边处置。但也正因为如斯,它不合适那些要对xml布局做静态调剂、或基于xml高低文布局做庞杂操纵的须要。若是你只是要剖析处置一个布局杰出的xml文档,那末它能够很好的完成使命。须要重视的是XML Parser只撑持三种编码格局:US-ASCII, ISO-8859-1和UTF-8,若是你的xml数据是其余编码,须要先转换成以上三个之一。
XML Parser经常操纵的剖析体例大致有两种(实在便是两个函数):xml_parse_into_struct和xml_set_element_handler。
xml_parse_into_struct
此体例是将xml数据剖析到两个数组中:
index数组——包罗指向Value 数组中值的地位的指针
value数组——包罗来自被剖析的 XML 的数据
这俩数组笔墨描写起来有点费事,仍是看个例子吧(来自php官方文档)
$simple = "<para><note>simple note</note></para>"; $p = xml_parser_create(); xml_parse_into_struct($p, $simple, $vals, $index); xml_parser_free($p); echo "Index array "; print_r($index); echo " Vals array "; print_r($vals);
输出:
Index array Array ( [PARA] => Array ( [0] => 0 [1] => 2 ) [NOTE] => Array ( [0] => 1 ) ) Vals array Array ( [0] => Array ( [tag] => PARA [type] => open [level] => 1 ) [1] => Array ( [tag] => NOTE [type] => complete [level] => 2 [value] => simple note ) [2] => Array ( [tag] => PARA [type] => close [level] => 1 ) )
此中index数组以标署名为key,对应的值是一个数组,外面包罗一切此标签在value数组中的地位。而后经由过程这个地位,找到此标签对应的值。
若是xml中每组数据格局有收支,不能做到完全同一,那末在写代码时要重视,说不定就获得了毛病的成果。比方上面这个例子:
$xml = " <infos> <para><note>note1</note><extra>extra1</extra></para> <para><note>note2</note></para> <para><note>note3</note><extra>extra3</extra></para> </infos> "; $p = xml_parser_create(); xml_parse_into_struct($p, $xml, $values, $tags); xml_parser_free($p); $result = array(); //上面的遍历体例有bug隐患 for ($i=0; $i<3; $i++) { $result[$i] = array(); $result[$i]["note"] = $values[$tags["NOTE"][$i]]["value"]; $result[$i]["extra"] = $values[$tags["EXTRA"][$i]]["value"]; } print_r($result);
若是根据上面那种体例遍历,看似代码简略,可是潜伏危急,最致命的是获得毛病的成果(extra3跑到第二个para里了)。以是要以一种比拟松散的体例遍历:
$result = array(); $paraTagIndexes = $tags["PARA"]; $paraCount = count($paraTagIndexes); for($i = 0; $i < $paraCount; $i += 2) { $para = array(); //遍历para标签对之间的一切值 for($j = $paraTagIndexes[$i]; $j < $paraTagIndexes[$i+1]; $j++) { $value = $values[$j]["value"]; if(empty($value)) continue; $tagname = strtolower($values[$j]["tag"]); if(in_array($tagname, array("note","extra"))) { $para[$tagname] = $value; } } $result[] = $para; }
实在我很罕用xml_parse_into_struct函数,以是上面所谓“松散”的代码保不齐还会有其余情况下的bug。- -|
xml_set_element_handler
这类体例是为parser设置处置元素肇端、元素停止的回调函数。配套的另有xml_set_character_data_handler用来为parser设置数据的回调函数。这类体例写的代码比拟清楚,利于保护。
Example:
$xml = <<<XML <infos> <para><note>note1</note><extra>extra1</extra></para> <para><note>note2</note></para> <para><note>note3</note><extra>extra3</extra></para> </infos> XML; $result = array(); $index = -1; $currData; function charactor($parser, $data) { global $currData; $currData = $data; } function startElement($parser, $name, $attribs) { global $result, $index; $name = strtolower($name); if($name == "para") { $index++; $result[$index] = array(); } } function endElement($parser, $name) { global $result, $index, $currData; $name = strtolower($name); if($name == "note" || $name == "extra") { $result[$index][$name] = $currData; } } $xml_parser = xml_parser_create(); xml_set_character_data_handler($xml_parser, "charactor"); xml_set_element_handler($xml_parser, "startElement", "endElement"); if (!xml_parse($xml_parser, $xml)) { echo "Error when parse xml: "; echo xml_error_string(xml_get_error_code($xml_parser)); } xml_parser_free($xml_parser); print_r($result);
可见,set handler体例固然代码行数多,但思绪清楚,可读性更好,不过机能上略慢于第一种体例,并且矫捷性不强。XML Parser撑持PHP4,合用于于操纵老版本的体系。对PHP5情况,仍是优先斟酌上面的体例吧。
2。 SimpleXML
SimpleXML是PHP5后供给的一套简略易用的xml东西集,能够把xml转换成便利处置的工具,也能够构造天生xml数据。不过它不合用于包罗namespace的xml,并且要保障xml格局完全(well-formed)。它供给了三个体例:simplexml_import_dom、simplexml_load_file、simplexml_load_string,函数名很直观地申了然函数的感化。三个函数都前往SimpleXMLElement工具,数据的读取/增添都是经由过程SimpleXMLElement操纵。
$string = <<<XML <?xml version="1.0"?> <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是很好的挑选。
3。 XMLReader
XMLReader也是PHP5以后的扩大(5.1后默许装置),它就像游标一样在文档流中挪动,并在每一个节点处停上去,操纵起来很矫捷。它供给了对输出的疾速和非缓存的流式拜候,能够读取流或文档,操纵户从中提取数据,并跳过对操纵法式不意思的记实。
以一个操纵google气候api获得信息的例子展现下XMLReader的操纵,这里也只触及到一小局部函数,更多还请参考官方文档。
$xml_uri = "http://www.google.com/ig/api?weather=Beijing&hl=zh-cn"; $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版本。
4。 DOMDocument
DOMDocument仍是PHP5后推出的DOM扩大的一局部,可用来成立或剖析html/xml,今朝只撑持utf-8编码。
$xmlstring = <<<XML <?xml version="1.0"?> <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 == 1) { $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; }
从函数名上看感受跟JavaScript很像,应当是鉴戒了一些吧。DOMDocument也是一次性将xml载入内存,以是内请安题一样须要重视。PHP供给了这么多的xml处置体例,开辟职员在挑选上就要花些时候领会,挑选合适名目须要及体系情况、又便于保护的体例。
以上这篇php剖析xml 的四种简略体例(附实例)便是小编分享给大师的全数内容了,但愿能给大师一个参考,也但愿大师多多撑持网页设想。