巅云智能建站平台搭建版(创业流派版)火爆上线,毕生受权!新增:文章智能收罗+全站真静态打包+都会分站+智能小法式+不法词过滤+H5自顺应+智能链词等功效功效概况
赞助文档Help

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 的四种简略体例(附实例)便是小编分享给大师的全数内容了,但愿能给大师一个参考,也但愿大师多多撑持网页设想。

一佰互联是天下着名建站品牌办事商,咱们有九年、网站建造、网页设想、php开辟和域名注册及假造主机办事经历,供给的办事更是天下着名。比来几年来还整合团队上风自立开辟了可视化多用户”“3.0平台版,拖拽排版网站建造设想,轻松完成pc站、手机微网站、小法式、APP一体化全网营销网站扶植 ,已胜利的为天下上百家收集公司供给自助建站平台搭建办事。

相干消息more

03
11月
为甚么天猫、京东、淘宝等电商网站都不采用呼应

为甚么天猫、京东、淘宝等电商网站都不采用呼应式设想? 比来写了一系列对呼应式网站的文章,终究有粉丝按捺不住问,为甚么呼应式网站那末好,京东... >>概况

13
04月
新期间若何做好黉舍网站扶植使命?

在新期间,黉舍网站作为黉舍对外展现的窗口,经由过程黉舍网站能够让更多的人领会从网上间接领会黉舍,晋升对黉舍的感知,并且黉舍网站也能够是黉舍师生之... >>概况

29
04月
php中的比拟运算符详解

1、对数组 $a=array(1,2,3,6); $b=array(1,2,3,6,8); echo ""; var_dump( $a&g... >>概况

24
03月
做网站用智能建站体系,感受就很爽

分享 做网站对会手艺的人来讲,能够是一个小题目,但对不会手艺的人来... >>概况

高端网站扶植

美工统筹SEO,为企业电子商务营销助力!

德律风:

023-85725751
建站

产物

域名注册 假造主机 云办事器 企业邮局
智能建站 APP打包 微站/小法式 创业平台
网站推行 媒体营销 智能收罗 AI机械人
400德律风 短信营销 店销机械人
私家定制 流派网站