您好,登錄后才能下訂單哦!
1)xml_parser_create([ string $encoding ] ):建立一個新的xml解析器并返回可被其他xml函數使用的資源句柄,
參數$encoding:
php4,中用來只指定要被解析的xml輸入的字符編碼方式;
php5,自動偵測輸入xml的編碼,encoding僅用來指定解析后輸出數據的編碼
默認:輸入編碼=輸出編碼
php5.0.2+默認編碼utf-8;之前版本,ISO-8859-1
2)bool xml_parser_set_option(resource $parser,int $option,mixed $value):為指定的的xml解析進行選項設置
parser:指向要設置選項信息的xml解析器指針
option:要設置選項的名稱
value:要設置選項的值
設置成功返回true,失敗返回false
選項數據類型描述
XML_OPTION_CASE_FOLDINGint 控制在該xml解析器中大小寫是否有效。默認有效,0原樣輸出,1轉換為大寫,只控制輸出樣式
XML_OPTION_SKIP_TAGSTARTint 指明在一個標記名前應略過幾個字符
XML_OPTION_SKIP_WHITEint 是否略過由空白字符組成的值
XML_OPTION_TARGET_ENCODINGstring
3)int xml_parse_into_struct(resource $parser,string $data,array &$values [,array &$index]):將xml
文件解析到兩個對應的數組中,index參數含有指向values數組中對應值的指針,該函數返回的是一級數組,不想dom樹那樣有層級關系
失敗返回0,成功返回1
4)eg:
源文件:
<?xml version="1.0" encoding="utf-8"?>
<newdata>
<version a="xxx">aaaa</version>
<sample><![CDATA[0]]></sample>
<all><![CDATA[https]]></all>
</newdata>
value結果:
Array
(
[0] => Array
(
//標簽名
[tag] => newdata
//節點狀態,open:含有子標簽,起始標簽;close:open的閉合部分;complete:無子標簽
[type] => open
//層級
[level] => 1
)
[1] => Array
(
[tag] => version
[type] => complete
[level] => 2
//節點屬性數組
[attributes] => Array
(
[a] => xxx
)
//節點值
[value] => aaaa
)
[2] => Array
(
[tag] => sample
[type] => complete
[level] => 2
[value] => 0
)
[3] => Array
(
[tag] => all
[type] => complete
[level] => 2
[value] => https
)
[4] => Array
(
[tag] => newdata
[type] => close
[level] => 1
)
)
索引結果:
Array
(
//節點名稱
[newdata] => Array
(
[0] => 0//節點起始索引
[1] => 4//節點結束索引
)
[version] => Array
(
[0] => 1
)
[sample] => Array
(
[0] => 2
)
[all] => Array
(
[0] => 3
)
)
5)將xml轉換為array的函數:
/**
* 將xml字符串轉換為數組
* @param string $contents
* @param string $encoding
* @param int $get_attrbutes
* @param string $priority
* @param array
*/
public static function xml2Array($contents = NULL, $encoding = 'UTF-8', $get_attributes = 1, $priority = 'tag') {
if(!$contents) {
return array();
}
if(!function_exists('xml_parser_create')) {
return array();
}
//xml解析器
$parser = xml_parser_create('');
xml_parser_set_option($parser,XML_OPTION_TARGET_ENCODING,$encoding);
//將標簽原樣輸出,不轉換成大寫
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
//是否忽略空白字符
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
//$xml_values,$index引用類型,將文本解析到指定的數組變量中
xml_parse_into_struct($parser, trim($contents), $xml_values/*,$index*/);
//釋放解析器
xml_parser_free($parser);
if(!$xml_values)
return array();
$xml_array = array();
$parents = array();
$opened_tags = array();
$arr = array();
//當前操作結構的指針
$current = & $xml_array;
//同級結構下重復標簽的計數
$repeated_tag_index = array();
foreach ($xml_values as $data) {
//刪除屬性和值,確保每次用到的是新的
unset($attributes, $value);
//將標簽結構數組,釋放到當前的變量域中
extract($data);
//存當前標簽的結果
$result = array();
//存屬性
$attributes_data = array();
//標簽有value
if(isset($value)) {
if($priority == 'tag'){
$result = trim($value);
}else{
$result['value'] = trim($value);
}
}
//標簽有屬性,且不忽略
if($get_attributes && isset($attributes)) {
foreach ($attributes as $attr => $val) {
if ($priority == 'tag'){//放入單獨記錄屬性的數組中
$attributes_data[$attr] = $val;
}else{//統一放入$result中
$result['attr'][$attr] = $val;
}
}
}
//處理節點關系
if ($type == "open") {//有子節點標簽
$parent[$level - 1] = & $current; //$parent[$level - 1],指向復合標簽的起始處
if (!is_array($current) || (!in_array($tag, array_keys($current)))) {//xml復合標簽的第一個
$current[$tag] = $result;//屬性獨立
/*處理結果
[tag] => Array
(
[value] => aaaa,
[attr] => Array
(
[a] => xxx
)
)
*/
if ($attributes_data){
$current[$tag . '_attr'] = $attributes_data;
/*處理結果
[tag] => xxxx,
[tag_attr] => Array
(
[a] => xxx
)
*/
}
$repeated_tag_index[$tag . '_' . $level] = 1;//記錄同級中該標簽重復的個數
//指針重新指向符合標簽的子標簽
$current = & $current[$tag];
}else {
if (isset($current[$tag][0])) {//第3+個同級復合標簽
$current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
$repeated_tag_index[$tag . '_' . $level] ++;
} else {//第2個同級復合標簽
//在關聯數組外包一層索引數組
$current[$tag] = array(
$current[$tag],
$result
);
$repeated_tag_index[$tag . '_' . $level] = 2;
//此處只記錄第一個重復標簽的屬性,可能有bug,需注意!
//要想區別各子標簽的屬性,需要將$priority設成非'tag'
if (isset($current[$tag . '_attr'])) {
$current[$tag]['0_attr'] = $current[$tag . '_attr'];
unset($current[$tag . '_attr']);
}
}
//記錄最后一個重復子標簽的索引
$last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
//指針指向下一個子標簽
$current = & $current[$tag][$last_item_index];
}
} elseif ($type == "complete") {
//第一個complete類型的標簽
if (!isset($current[$tag])) {
$current[$tag] = $result;
$repeated_tag_index[$tag . '_' . $level] = 1;
if ($priority == 'tag' && $attributes_data)
$current[$tag . '_attr'] = $attributes_data;
}
else {
//第3+個同級子標簽
//此處只有$current[$tag][0],不行,因為可能索引到字符串的第一個字符
if(isset($current[$tag][0]) && !is_array($current[$tag])){
print_r($current);exit();
}
if(isset($current[$tag][0]) && is_array($current[$tag])) {
$current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
//子標簽的屬性不忽略
if ($get_attributes && $priority == 'tag' && $attributes_data) {
$current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
}
$repeated_tag_index[$tag . '_' . $level] ++;
}else{//第2個同級子標簽
$current[$tag] = array(
$current[$tag],
$result
);
$repeated_tag_index[$tag . '_' . $level] = 1;
if ($priority == 'tag' && $get_attributes) {
if (isset($current[$tag . '_attr'])) {
$current[$tag]['0_attr'] = $current[$tag . '_attr'];
unset($current[$tag . '_attr']);
}
if ($attributes_data) {
$current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
}
}
$repeated_tag_index[$tag . '_' . $level] ++;
}
}
}elseif($type == 'close'){
//閉合標簽和起始標簽level相同,因此進入complete類型的子標簽后,可以通過父節點的close標簽,可以指回到父節點
$current = & $parent[$level - 1];
}
}
return $xml_array;
}
6)關于xml中的CDATA:
在XML文檔中的所有文本都會被解析器解析。只有在CDATA部件之內的文本會被解析器忽略
一個 CDATA 部件以"< ![CDATA[" 標記開始,以"]]>"標記結束:
< script>
< ![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1
}
else
{
return 0
}
}
]]>
< /script>
在前面的例子中,所有在CDATA部件之間的文本都會被解析器忽略。
CDATA注意事項:
CDATA部件之間不能再包含CDATA部件(不能嵌套)。如果CDATA部件包含了字符"]]>" 或者"< ! [CDATA[" ,將很有可能出錯哦。
同樣要注意在字符串"]]>"之間沒有空格或者換行符
參考地址:http://www.cnblogs.com/chenqingwei/archive/2010/04/21/1717237.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。