微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DOMDocument方法解析xml节点


可用PHP解析,也可用js解析。PHP和js直接的区别是,一个是用 . ,一个是 -> ,其他都一样

PHP中loadXML方法中参数是xml的字符串,load方法中参数是xml文件路径

$dom = new DOMDocument();
$dom->loadXML($xmlstring);
$rootNode = $dom->documentElement;


node属性
nodeType:显示节点的类型
nodeName:显示节点的名称
nodeValue:显示节点的值
attributes:获取一个属性节点
firstChild:表示某一节点的第一个节点
lastChild:表示某一节点的最后一个子节点
childNodes:表示所在节点的所有子节点
parentNode:表示所在节点的父节点
nextSibling:紧挨着当前节点的下一个节点
prevIoUsSibling:紧挨着当前节点的上一个节点
node方法
asChildNodes()方法:判定一个节点是否有子节点,有返回true,没有返回false
removeChild()方法去除一个节点
appendChild()方法添加一个节点,如果文档树中已经存在该节点,则将它删除,然后在新位置插入
replaceChild()方法:从文档树中删除(并返回)指定的子节点,用另一个节点来替换它
insertBefore()方法:在指定节点的前面插入一个节点,如果已经存在,则删除原来的,然后在新位置插入
cloneNode()方法:复制一个节点,该方法一个参数,true表示同时复制所有的子节点,false表示近复制当前节点\


下面是js解析Dom

[xhtml] view plain copy
  1. <html>
  2. title>node</>
  3. headbodyname="bodyName"divid="id"name="hello">span>aaaa>bbbb>ccccdivbodymce:scripttype="text/ahref="http://lib.csdn.net/base/javascript"class='replace_word'title="JavaScript知识库"target='_blank'style='color:#df3434;font-weight:bold;'>JavaScripta>"><!--
  4. document.write("-----------------------节点属性-------------------------br>");
  5. varmyTest=document.getElementById("id");
  6. document.write(myTest.nodeType+" document.write(myTest.nodeName+">");
  7. document.write(myTest.nodeValue+" document.write("-----------------------节点attribute用法----------------------- document.write(myTest.getAttributeNode("name").nodeName+" document.write(myTest.getAttributeNode("name").nodeValue+" document.write(myTest.attributes("name").name+" document.write(myTest.attributes("name").value+" document.write("-----------------------firstChild用法------------------------- document.write(myTest.firstChild.nodeType+" document.write(myTest.firstChild.nodeName+" document.write(myTest.firstChild.nodeValue+" document.write("-----------------------lastChold用法------------------------- document.write(myTest.lastChild.nodeType+" document.write(myTest.lastChild.nodeName+" document.write(myTest.lastChild.nodeValue+" document.write("-----------------------childNodes用法------------------------- varnodes=myTest.childNodes;
  8. for(vari=0;inodes.length;i++){
  9. document.write(nodes[i].nodeName+"======"+nodes[i].innerHTML+" }
  10. document.write("-----------------------parentNode用法------------------------- varnodeP=myTest.parentNode;
  11. document.write(nodeP.nodeType+" document.write(nodeP.nodeName+" document.write(nodeP.nodeValue+" document.write(nodeP.getAttributeNode("name").nodeValue+" document.write("-----------------------hasChildNodes()用法------------------------- document.write(myTest.hasChildNodes());
  12. document.write(">-----------------------removeChild()用法------------------------- myTest.removeChild(myTest.firstChild);
  13. >-----------------------appendChild()用法------------------------- varnewd=document.createElement("span");
  14. newd.innerHTML="eeee";
  15. myTest.appendChild(newd);
  16. >-----------------------replaceChild()用法------------------------- myTest.replaceChild(newd,myTest.firstChild);
  17. >-----------------------insertBefore()用法------------------------- myTest.insertBefore(newd,myTest.lastChild);
  18. >-----------------------cloneNode()用法------------------------- varih=myTest.firstChild.cloneNode(true).innerHTML;
  19. document.getElementById("id").innerHTML=ih;
  20. //--mce:script>

PHP解析xml:PHP用DOMDocument解析xml,不能解析含有命名空间的xml,而且对节点的值有点问题,它包含子节点的值

xml:

<!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代码
<?PHP

$myfile = fopen("comp.xml","r") or die("Unable to open file!");
$xmlstring=fread($myfile,filesize("comp.xml"));
fclose($myfile);


$dom = new DOMDocument();
$dom->loadXML($xmlstring);

$ary = array();
$num = 0;
$flag = "①";
genArray($dom->documentElement,$ary,$num,$flag);
print_r(json_encode($ary));

function genArray($node,&$ary,&$num,$flag){
	$nodeArray = array();
	$num = $num + 1;
	$numStr = $flag.$num;
	
	if ($node->hasAttributes()) {
	    foreach ($node->attributes as $attr) {
	      	$nodeArray[$attr->nodeName] = $attr->nodeValue;
	    }
	}
	
	
	if(isset($node->nodeValue)){
		echo "nodepath:".($node->getNodePath())."<br/>";
		$nodeArray['textValue'] = trim($node->nodeValue);
	}
	

	if ($node->hasChildNodes()) {
	    if ($node->childNodes->length == 1) {
	        genArray($node->firstChild,$nodeArray,$flag);
	    } else {
	      foreach ($node->childNodes as $childNode) {
		      if ($childNode->nodeType != XML_TEXT_NODE) {
		          genArray($childNode,$flag);
		      }
	    	}
	  	}
	}
	
	$ary[($node->nodeName).$numStr] = $nodeArray;
}
?>


PHP代码中node同样也可以使用getElementsByTag("节点名称")来获取对应的节点。
$childNode = $node->getElementsByTag("div").item(0);
 PHP和js直接的区别是,js中直接用document相当于PHP中的$PHPDocument 
 
 
$dom = new DOMDocument();
$dom->loadXML($xmlstring);
$PHPDocument = $dom->documentElement;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类