Whether it is desktop software development or WEB application, XML is everywhere!
However, in daily work, we only use some encapsulated classes to process XML, including generation, parsing, etc. I have some free time during the holidays, so I summarized several XML parsing methods in PHP as follows:
Taking parsing the weather conditions provided by the Google API interface as an example, we take today's weather and temperature.
API address: http://www.google.com/ig/api?weather=shenzhen
[XML file content]
<?xml version="1.0"?> <xml_api_reply version="1"> <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" > <forecast_information> <city data="Shenzhen, Guangdong"/> <postal_code data="shenzhen"/> <latitude_e6 data=""/> <longitude_e6 data=""/> <forecast_date data="2009-10-05"/> <current_date_time data="2009-10-04 05:02:00 +0000"/> <unit_system data="US"/> </forecast_information> <current_conditions> <condition data="Sunny"/> <temp_f data="88"/> <temp_c data="31"/> <humidity data="Humidity: 49%"/> <icon data="/ig/images/weather/sunny.gif"/> <wind_condition data="Wind: mph"/> </current_conditions> </weather> </xml_api_reply>
[Use DomDocument parsing]
<?PHP header("Content-type:text/html; Charset=utf-8"); $url = "http://www.google.com/ig/api?weather=shenzhen"; // 加载XML内容 $content = file_get_contents($url); $content = get_utf8_string($content); $dom = DOMDocument::loadXML($content); /* 此处也可使用如下所示的代码, $dom = new DOMDocument(); $dom->load($url); */ $elements = $dom->getElementsByTagName("current_conditions"); $element = $elements->item(0); $condition = get_google_xml_data($element, "condition"); $temp_c = get_google_xml_data($element, "temp_c"); echo '天气:', $condition, '<br />'; echo '温度:', $temp_c, '<br />'; function get_utf8_string($content) { // 将一些字符转化成utf8格式 $encoding = mb_detect_encoding($content, array('ASCII','UTF-8','GB2312','GBK','BIG5')); return mb_convert_encoding($content, 'utf-8', $encoding); } function get_google_xml_data($element, $tagname) { $tags = $element->getElementsByTagName($tagname); // 取得所有的$tagname $tag = $tags->item(0); // 获取第一个以$tagname命名的标签 if ($tag->hasAttributes()) { // 获取data属性 $attribute = $tag->getAttribute("data"); return $attribute; }else { return false; } } ?>
This is just a simple example, including only loadXML, item, getAttribute, getElementsByTagName and other methods. There are also some useful methods. This is based on your actual situation. need.
【XMLReader】
When we use php to interpret the content of xml, there are many objects that provide functions so that we don’t have to parse them character by character. Just based on the tag and attribute name, you can retrieve the attributes and content in the file, which is much more convenient. The XMLReader sequentially browses the nodes of the xml file, which can be imagined as a cursor walking through the nodes of the entire file, and grabs the required content.
<?PHP header("Content-type:text/html; Charset=utf-8"); $url = "http://www.google.com/ig/api?weather=shenzhen"; // 加载XML内容 $xml = new XMLReader(); $xml->open($url); $condition = ''; $temp_c = ''; while ($xml->read()) { // echo $xml->name, "==>", $xml->depth, "<br>"; if (!empty($condition) && !empty($temp_c)) { break; } if ($xml->name == 'condition' && empty($condition)) { // 取第一个condition $condition = $xml->getAttribute('data'); } if ($xml->name == 'temp_c' && empty($temp_c)) { // 取第一个temp_c $temp_c = $xml->getAttribute('data'); } $xml->read(); } $xml->close(); echo '天气:', $condition, '<br />'; echo '温度:', $temp_c, '<br />';
We just need to get the first condition and the first temp_c, so we traverse all the nodes, write the first condition and the first temp_c encountered into variables, and finally output them.
[DOMXPath]
This method requires using the DOMDocument object to create the structure of the entire document,
<?PHP header("Content-type:text/html; Charset=utf-8"); $url = "http://www.google.com/ig/api?weather=shenzhen"; // 加载XML内容 $dom = new DOMDocument(); $dom->load($url); $xpath = new DOMXPath($dom); $element = $xpath->query("/xml_api_reply/weather/current_conditions")->item(0); $condition = get_google_xml_data($element, "condition"); $temp_c = get_google_xml_data($element, "temp_c"); echo '天气:', $condition, '<br />'; echo '温度:', $temp_c, '<br />'; function get_google_xml_data($element, $tagname) { $tags = $element->getElementsByTagName($tagname); // 取得所有的$tagname $tag = $tags->item(0); // 获取第一个以$tagname命名的标签 if ($tag->hasAttributes()) { // 获取data属性 $attribute = $tag->getAttribute("data"); return $attribute; }else { return false; } } ?>
[xml_parse_into_struct]
Description: int xml_parse_into_struct (resource parser, string data, array &values [, array &index])
This function parses the XML file into two corresponding arrays. The index parameter contains points to values. Pointer to the corresponding value in the array. The last two array parameters can be passed to the function by pointers.
Note: xml_parse_into_struct() returns 0 on failure and 1 on success. This is different from FALSE and TRUE, so be careful when using operators such as ===.
<?PHP header("Content-type:text/html; Charset=utf-8"); $url = "http://www.google.com/ig/api?weather=shenzhen"; // 加载XML内容 $content = file_get_contents($url); $p = xml_parser_create(); xml_parse_into_struct($p, $content, $vals, $index); xml_parser_free($p); echo '天气:', $vals[$index['CONDITION'][0]]['attributes']['DATA'], '<br />'; echo '温度:', $vals[$index['TEMP_C'][0]]['attributes']['DATA'], '<br />';
【Simplexml】
This method is available in PHP5
There are relevant examples in Google’s official documentation, as follows:
// Charset: utf-8 /** * 用php Simplexml 调用google天气预报api,和g官方的例子不一样 * google 官方php domxml 获取google天气预报的例子 * http://www.google.com/tools/toolbar/buttons/intl/zh-CN/apis/howto_guide.html * * @copyright Copyright (c) 2008 <cmpan(at)qq.com> * @license New BSD License * @version 2008-11-9 */ // 城市,用城市拼音 $city = empty($_GET['city']) ? 'shenzhen' : $_GET['city']; $content = file_get_contents("http://www.google.com/ig/api?weather=$city&hl=zh-cn"); $content || die("No such city's data"); $content = mb_convert_encoding($content, 'UTF-8', 'GBK'); $xml = simplexml_load_string($content); $date = $xml->weather->forecast_information->forecast_date->attributes(); $html = $date. "<br>\r\n"; $current = $xml->weather->current_conditions; $condition = $current->condition->attributes(); $temp_c = $current->temp_c->attributes(); $humidity = $current->humidity->attributes(); $icon = $current->icon->attributes(); $wind = $current->wind_condition->attributes(); $condition && $condition = $xml->weather->forecast_conditions->condition->attributes(); $icon && $icon = $xml->weather->forecast_conditions->icon->attributes(); $html.= "当前: {$condition}, {$temp_c}°C,<img src='http://www.google.com/ig{$icon}'/> {$humidity} {$wind} <br />\r\n"; foreach($xml->weather->forecast_conditions as $forecast) { $low = $forecast->low->attributes(); $high = $forecast->high->attributes(); $icon = $forecast->icon->attributes(); $condition = $forecast->condition->attributes(); $day_of_week = $forecast->day_of_week->attributes(); $html.= "{$day_of_week} : {$high} / {$low} °C, {$condition} <img src='http://www.google.com/ig{$icon}' /><br />\r\n"; } header('Content-type: text/html; Charset: utf-8'); print $html; ?>
Related recommendations: PHP tutorial
The above is the detailed content of Several methods for parsing XML with PHP (with code). For more information, please follow other related articles on the PHP Chinese website!