php--xml转json

2 篇文章 0 订阅
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>页面编辑</title>
 	<link rel="stylesheet" type="text/css" href="../jquery-easyui-1.4.5/themes/default/easyui.css"/>
	<link rel="stylesheet" type="text/css" href="../jquery-easyui-1.4.5/themes/icon.css"/>
	<link rel="stylesheet" type="text/css" href="../jquery-easyui-1.4.5/demo/demo.css"/>  
	<link rel="stylesheet" type="text/css" href="../css/index.css"/>
	<link rel="stylesheet" type="text/css" href="../css/easyui-change.css"/>
	<script type="text/javascript" src="../jquery-easyui-1.4.5/jquery.min.js"></script>
	<script type="text/javascript" src="../jquery-easyui-1.4.5/jquery.easyui.min.js"></script>
	<script type="text/javascript" src="../jsPackage/datagrid-groupview.js"></script>
	<script type="text/javascript" src="../jsPackage/datagrid-cellediting.js"></script>
	<script type="text/javascript" src="../JS/init/html_init.js"></script>
	<script type="text/javascript" src="../JS/topPanel/file_operations.js"></script>
	<script type="text/javascript" src="../JS/topPanel/edit_operations.js"></script>
	<script type="text/javascript" src="../JS/multipleUse/module_load.js"></script>
	<script type="text/javascript" src="../JS/rightPanel/output_tree_data.js"></script>
</head>
<body>
	
		<div id="topPanel" class="topPanel">
			
		    <div class="easyui-panel" style="padding:5px;">
		        <a href="#" class="easyui-menubutton" data-options="menu:'#mm0'">文件</a>
		        <a href="#" class="easyui-menubutton" data-options="menu:'#mm1',iconCls:'icon-edit'">编辑</a>
		    </div>
		    <div id="mm0" style="width:150px;">
		     	<div id="menubutton_file_add" data-options="iconCls:'icon-add'">新建</div>
		     	 <div class="menu-sep"></div>
		     	<div id="menubutton_file_open" data-options="iconCls:'icon-redo'">打开</div>
		     	 <div class="menu-sep"></div>
		        <div id="menubutton_file_save" data-options="iconCls:'icon-save'">存储</div>
		         <div class="menu-sep"></div>
		        <div id="menubutton_file_saveIN" data-options="iconCls:'icon-undo'">存储为</div>
		         <div id="menubutton_file_out" class="menu-sep"></div>
		        <div data-options="">退出</div>
		    </div>
		    <div id="mm1" style="width:150px;">
		        <div>
		            <span>插入JS脚本</span>
		            <div>
		                <div id="menubutton_edit_elementBefore">元素之前</div>
		                <div class="menu-sep"></div>
		                <div id="menubutton_edit_elementAfter">元素之后</div>
		            </div>
		        </div>
		        <div class="menu-sep"></div>
		        <div id="menubutton_edit_style">样式</div>
		        <div class="menu-sep"></div>
		        <div id="menubutton_edit_debug" data-options="iconCls:'icon-tip'">调试</div>
		    </div>
		</div>
		
		<div id="leftPanel" class="leftPanel"></div>
		<div id="centerPanel" class="centerPanel">
		  <!--  
			<iframe id="centerShow" src="../show/show.html" style="width:100%;height:100%;overflow:auto;"></iframe>
			-->
			<div style="margin-top:50px;margin-left:50px;"><font size="4" color="blue">欢迎进入web页面编辑器</font></div>
		</div>
		<div id="rightPanel" class="rightPanel">
			<div id="edit" style="display:none">
				<div>
					<ul id="rightTreePanel" class="rightTreePanel"></ul>
					<div id="rightTree_menu"></div>
				</div>
				<div>
					<div id="rightDataGridPanel" class="rightDataGridPanel"></div>
					<div style="margin-top:2px">
						<input type="text" name="searchProperties" id="searchProperties"/>
						<font>自动刷新</font>
						<div id="autoRefresh_switchBtn"></div>
						<span id="handRefresh"></span>
					</div>
				</div>
			</div>
		</div>
		<div id="bottomPanel" class="bottomPanel">
			<div id="bottomPanel_panel" class="easyui-panel" style="padding:5px;height:50px;overflow-y:auto;"></div>
		</div>
		<div id="win"></div>
		<div id="style_window">
		</div>
</body>
</html>


现在用php去解析这个xml文件,将它变为json数据

php代码:

<?php

	// 打开文件并读取数据并关闭
	$fp = fopen("comp.xml", 'r');
	$xmldata = fread($fp, filesize("comp.xml"));
	fclose($fp);
	
	// 节点上的分隔符
	$flag = "②";
	
	// 如果节点有值,那么#text就叫做textValue属性
	$valueTextName = "textValue";
	
	$json = xmlStr_to_json($xmldata, $valueTextName, $flag);
	
	print_r($json);
	
	function xmlStr_to_json($xmldata, $valueTextName, $flag){
	
		// 生成xml解析器
		$xmlparser = xml_parser_create();
		
		// 设置xml解析器的参数
		// 控制在该 XML 解析器中 大小写折叠(case-folding) 是否有效。其默认值为有效。 这里填写0表示无效
		xml_parser_set_option($xmlparser, XML_OPTION_CASE_FOLDING, 0);
		
		// 是否略过由白空字符组成的值。 0为false,其他都为true
		xml_parser_set_option($xmlparser, XML_OPTION_SKIP_WHITE, 1);
		
		// 将xml解析器中的数据生成数据$values, 当然也可以生成index的数组, 请看标准文档 
		xml_parse_into_struct($xmlparser,$xmldata,$values);
		
		// 释放xml解析器
		xml_parser_free($xmlparser);
		
		// 将每个节点都作为不同的数据,有①是为了后面好拆分
		$flagNum = 0;
	
		// 中间生成的数组
		$data = array();
		
		// 最终要生成的数组
		$afterCleanData = array();
		
		values_to_data($data, $values, $flagNum, $flag, $valueTextName);
		clean_level($data, $flag, $afterCleanData);
		return json_encode($afterCleanData);
	}
	
	// 清除中间产生的data数组中的 level 属性
	function clean_level($data, $flag, &$afterCleanData){
		foreach($data as $x => $x_value){
			$text = $flag."level".$flag;
			if(is_array($x_value)){
				$afterCleanData[$x] = array();
				clean_level($data[$x], $flag, $afterCleanData[$x]);
			}
			else{
				if($x != $text){
					$afterCleanData[$x] = $data[$x];
				}
			}
		}
	}
	
	// 从xml解析器中的values数组生成中间数组data
	function values_to_data(&$data, $values, &$flagNum, $flag, $valueTextName){
		foreach($values as $x =>$x_value){
			$flagNum = $flagNum + 1;
			$flagStr = $flag.$flagNum;
			//	$parentText = ($x_value["tag"]).$flagStr;
			//	echo $parentText."<br/>";
			$parentText = "";
			findParentText($data,$x_value,$parentText,$flag);
			
			if($x_value["type"] == "complete" || $x_value["type"] == "open"){
				//	echo $flagNum."<br/>";
				pushNode($data,$x_value,$parentText, $flagStr, $valueTextName, $flag);
			}
		} 
	}
	
	// 查找父类节点
	function findParentText($data,$nowNode,&$parentText,$flag){
		foreach($data as $x =>$x_value){
			if(is_array($x_value)){
				$text = $flag."level".$flag;
				if($nowNode['level']>$data[$x][$text]){
					$parentText=$x;
					// 要不断的遍历下去才能找到最接近nowNode节点的父类
					findParentText($data[$x],$nowNode,$parentText,$flag);
				}
			}	
		}
	}
	
	// 向新的data数组中插入节点数据
	function pushNode(&$data, $nowNode, $parentText, $flagStr, $valueTextName, $flag){
		// 因为最开始的时候是没有parentText的
		if($parentText == null || $parentText == ""){
			$nodeArray=array();
			$text = $flag."level".$flag;
			$nodeArray[$text] = $nowNode["level"];
			// 获取节点值
			if(isset($nowNode["value"])){
				$nodeArray[$valueTextName] = $nowNode["value"];
			}
			
			// 获取节点属性
			if( isset($nowNode["attributes"]) && is_array($nowNode["attributes"])){
				foreach($nowNode["attributes"] as $x1 => $x1_value1){
					$nodeArray[$x1] = $x1_value1;
				}
			}
			$text = $nowNode["tag"].$flagStr;
			$data[$text]=$nodeArray;
		}
		else{
			foreach($data as $x =>$x_value){
				if($x==$parentText){
					$nodeArray=array();
					$text = $flag."level".$flag;
					$nodeArray[$text] = $nowNode["level"];
					// 获取节点值
					if(isset($nowNode["value"])){
						$nodeArray[$valueTextName] = $nowNode["value"];
					}
					// 获取节点属性
					if(isset($nowNode["attributes"])){
						foreach($nowNode["attributes"] as $x1 => $x1_value1){
							$nodeArray[$x1] = $x1_value1;
						}
					}
					$text = $nowNode["tag"].$flagStr;
					$data[$x][$text]=$nodeArray;
				}
				else{
					if(is_array($data[$x])){
						pushNode($data[$x],$nowNode,$parentText,$flagStr,$valueTextName, $flag);
					}
				}
			}
		}
		
	}

?>


代码运行结果:

var a = {
	"html\u24611" : {
		"head\u24612" : {
			"meta\u24613" : {
				"http-equiv" : "Content-Type",
				"content" : "text\/html; charset=utf-8"
			},
			"title\u24614" : {
				"textValue" : "\u9875\u9762\u7f16\u8f91"
			},
			"link\u24615" : {
				"rel" : "stylesheet",
				"type" : "text\/css",
				"href" : "..\/jquery-easyui-1.4.5\/themes\/default\/easyui.css"
			},
			"link\u24616" : {
				"rel" : "stylesheet",
				"type" : "text\/css",
				"href" : "..\/jquery-easyui-1.4.5\/themes\/icon.css"
			},
			"link\u24617" : {
				"rel" : "stylesheet",
				"type" : "text\/css",
				"href" : "..\/jquery-easyui-1.4.5\/demo\/demo.css"
			},
			"link\u24618" : {
				"rel" : "stylesheet",
				"type" : "text\/css",
				"href" : "..\/css\/index.css"
			},
			"link\u24619" : {
				"rel" : "stylesheet",
				"type" : "text\/css",
				"href" : "..\/css\/easyui-change.css"
			},
			"script\u246110" : {
				"type" : "text\/javascript",
				"src" : "..\/jquery-easyui-1.4.5\/jquery.min.js"
			},
			"script\u246111" : {
				"type" : "text\/javascript",
				"src" : "..\/jquery-easyui-1.4.5\/jquery.easyui.min.js"
			},
			"script\u246112" : {
				"type" : "text\/javascript",
				"src" : "..\/jsPackage\/datagrid-groupview.js"
			},
			"script\u246113" : {
				"type" : "text\/javascript",
				"src" : "..\/jsPackage\/datagrid-cellediting.js"
			},
			"script\u246114" : {
				"type" : "text\/javascript",
				"src" : "..\/JS\/init\/html_init.js"
			},
			"script\u246115" : {
				"type" : "text\/javascript",
				"src" : "..\/JS\/topPanel\/file_operations.js"
			},
			"script\u246116" : {
				"type" : "text\/javascript",
				"src" : "..\/JS\/topPanel\/edit_operations.js"
			},
			"script\u246117" : {
				"type" : "text\/javascript",
				"src" : "..\/JS\/multipleUse\/module_load.js"
			},
			"script\u246118" : {
				"type" : "text\/javascript",
				"src" : "..\/JS\/rightPanel\/output_tree_data.js"
			}
		},
		"body\u246120" : {
			"div\u246121" : {
				"id" : "topPanel",
				"class" : "topPanel",
				"div\u246122" : {
					"class" : "easyui-panel",
					"style" : "padding:5px;",
					"a\u246123" : {
						"textValue" : "\u6587\u4ef6",
						"href" : "#",
						"class" : "easyui-menubutton",
						"data-options" : "menu:'#mm0'"
					},
					"a\u246124" : {
						"textValue" : "\u7f16\u8f91",
						"href" : "#",
						"class" : "easyui-menubutton",
						"data-options" : "menu:'#mm1',iconCls:'icon-edit'"
					}
				},
				"div\u246126" : {
					"id" : "mm0",
					"style" : "width:150px;",
					"div\u246127" : {
						"textValue" : "\u65b0\u5efa",
						"id" : "menubutton_file_add",
						"data-options" : "iconCls:'icon-add'"
					},
					"div\u246128" : {
						"class" : "menu-sep"
					},
					"div\u246129" : {
						"textValue" : "\u6253\u5f00",
						"id" : "menubutton_file_open",
						"data-options" : "iconCls:'icon-redo'"
					},
					"div\u246130" : {
						"class" : "menu-sep"
					},
					"div\u246131" : {
						"textValue" : "\u5b58\u50a8",
						"id" : "menubutton_file_save",
						"data-options" : "iconCls:'icon-save'"
					},
					"div\u246132" : {
						"class" : "menu-sep"
					},
					"div\u246133" : {
						"textValue" : "\u5b58\u50a8\u4e3a",
						"id" : "menubutton_file_saveIN",
						"data-options" : "iconCls:'icon-undo'"
					},
					"div\u246134" : {
						"id" : "menubutton_file_out",
						"class" : "menu-sep"
					},
					"div\u246135" : {
						"textValue" : "\u9000\u51fa",
						"data-options" : ""
					}
				},
				"div\u246137" : {
					"id" : "mm1",
					"style" : "width:150px;",
					"div\u246138" : {
						"span\u246139" : {
							"textValue" : "\u63d2\u5165JS\u811a\u672c"
						},
						"div\u246140" : {
							"div\u246141" : {
								"textValue" : "\u5143\u7d20\u4e4b\u524d",
								"id" : "menubutton_edit_elementBefore"
							},
							"div\u246142" : {
								"class" : "menu-sep"
							},
							"div\u246143" : {
								"textValue" : "\u5143\u7d20\u4e4b\u540e",
								"id" : "menubutton_edit_elementAfter"
							}
						}
					},
					"div\u246146" : {
						"class" : "menu-sep"
					},
					"div\u246147" : {
						"textValue" : "\u6837\u5f0f",
						"id" : "menubutton_edit_style"
					},
					"div\u246148" : {
						"class" : "menu-sep"
					},
					"div\u246149" : {
						"textValue" : "\u8c03\u8bd5",
						"id" : "menubutton_edit_debug",
						"data-options" : "iconCls:'icon-tip'"
					}
				}
			},
			"div\u246152" : {
				"id" : "leftPanel",
				"class" : "leftPanel"
			},
			"div\u246153" : {
				"id" : "centerPanel",
				"class" : "centerPanel",
				"div\u246154" : {
					"style" : "margin-top:50px;margin-left:50px;",
					"font\u246155" : {
						"textValue" : "\u6b22\u8fce\u8fdb\u5165web\u9875\u9762\u7f16\u8f91\u5668",
						"size" : "4",
						"color" : "blue"
					}
				}
			},
			"div\u246158" : {
				"id" : "rightPanel",
				"class" : "rightPanel",
				"div\u246159" : {
					"id" : "edit",
					"style" : "display:none",
					"div\u246160" : {
						"ul\u246161" : {
							"id" : "rightTreePanel",
							"class" : "rightTreePanel"
						},
						"div\u246162" : {
							"id" : "rightTree_menu"
						}
					},
					"div\u246164" : {
						"div\u246165" : {
							"id" : "rightDataGridPanel",
							"class" : "rightDataGridPanel"
						},
						"div\u246166" : {
							"style" : "margin-top:2px",
							"input\u246167" : {
								"type" : "text",
								"name" : "searchProperties",
								"id" : "searchProperties"
							},
							"font\u246168" : {
								"textValue" : "\u81ea\u52a8\u5237\u65b0"
							},
							"div\u246169" : {
								"id" : "autoRefresh_switchBtn"
							},
							"span\u246170" : {
								"id" : "handRefresh"
							}
						}
					}
				}
			},
			"div\u246175" : {
				"id" : "bottomPanel",
				"class" : "bottomPanel",
				"div\u246176" : {
					"id" : "bottomPanel_panel",
					"class" : "easyui-panel",
					"style" : "padding:5px;height:50px;overflow-y:auto;"
				}
			},
			"div\u246178" : {
				"id" : "win"
			},
			"div\u246179" : {
				"id" : "style_window"
			}
		}
	}
}

解析:

php中有很多能够解析xml的。

// 生成xml解析器
$xmlparser = xml_parser_create();
		
// 设置xml解析器的参数
// 控制在该 XML 解析器中 大小写折叠(case-folding) 是否有效。其默认值为有效。 这里填写0表示无效
xml_parser_set_option($xmlparser, XML_OPTION_CASE_FOLDING, 0);
		
// 是否略过由白空字符组成的值。 0为false,其他都为true
xml_parser_set_option($xmlparser, XML_OPTION_SKIP_WHITE, 1);
		
// 将xml解析器中的数据生成数据$values, 当然也可以生成index的数组, 请看标准文档 
xml_parse_into_struct($xmlparser,$xmldata,$values);
		
// 释放xml解析器
xml_parser_free($xmlparser);


如果不设置xml_parser_set_option方法的时候,则返回回来的结果所有节点名称,节点属性名称都是大写的。至于xml_parser_set_option方法中的参数介绍:

xml_parser_set_option

(PHP 4, PHP 5)

xml_parser_set_option — 为指定 XML 解析进行选项设置

说明

bool xml_parser_set_option ( resource $parser , int $option , mixed $value )

parser
指向要设置选项信息的 XML 解析器的指针。
option
要设置的选项名称。请参考下文。
value
要给选项设置的新值。

如果 parser 参数没有指向一个合法的解析器或者指定的选项无法设置,该函数将返回 FALSE,否则将会把选项设置为指定的值并返回 TRUE

可被设置的选项如下:

XML 解析器选项
选项常量 数据类型 描述
XML_OPTION_CASE_FOLDING integer 控制在该 XML 解析器中 大小写折叠(case-folding) 是否有效。其默认值为有效(默认为1,即true)。大小写折叠是都变成大写的意思
XML_OPTION_SKIP_TAGSTART integer 指明在一个标记名前应略过几个字符。
XML_OPTION_SKIP_WHITE integer 是否略过由白空字符组成的值。
XML_OPTION_TARGET_ENCODING string 设置该 XML 解析器所使用的目标编码(target encoding)方式。其默认值和由 xml_parser_create() 函数设置的源编码(source encoding)方式相同。支持的目标编码方式有 ISO-8859-1US-ASCII 和 UTF-8



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值