1. 云栖社区>
  2. PHP教程>
  3. 正文

PHP用DOMDocument解析xml文件

作者:用户 来源:互联网 时间:2017-12-01 13:44:07

文件

PHP用DOMDocument解析xml文件 - 摘要: 本文讲的是PHP用DOMDocument解析xml文件, 例子1: 循环所有 "artist" 元素 (nodetypes = 1),查找与 JavaScript 所传数据向匹配的名字 找到 CD 包含的正确 artist 输出 album 的信息 xml文件: <CATALOG>

例子1:
  1. 循环所有 "artist" 元素 (nodetypes = 1),查找与 JavaScript 所传数据向匹配的名字
  2. 找到 CD 包含的正确 artist
  3. 输出 album 的信息

xml文件:
<CATALOG><CD><TITLE>Empire Burlesque</TITLE><ARTIST>Bob Dylan</ARTIST><COUNTRY>USA</COUNTRY><COMPANY>Columbia</COMPANY><PRICE>10.90</PRICE><YEAR>1985</YEAR></CD><CD><TITLE>Hide your heart</TITLE><ARTIST>Bonnie Tyler</ARTIST><COUNTRY>UK</COUNTRY><COMPANY>CBS Records</COMPANY><PRICE>9.90</PRICE><YEAR>1988</YEAR></CD>
·········
</CATALOG>
xml文件分析:<a href=PHP用DOMDocument解析xml文件">
php文件:步骤:
  1. 循环所有 "artist" 元素 (nodetypes = 1),查找与 JavaScript 所传数据向匹配的名字
  2. 找到 CD 包含的正确 artist
  3. 输出 album 的信息
<?php$q=$_GET["q"];$xmlDoc = new DOMDocument();$xmlDoc->load("cd_catalog.xml");$x=$xmlDoc->getElementsByTagName('ARTIST');   //通过ARTIST标签找到ARTIST结点for ($i=0; $i<=$x->length-1; $i++){//Process only element nodesif ($x->item($i)->nodeType==1)   //【注释1】   {  if ($x->item($i)->childNodes->item(0)->nodeValue == $q) //【注释2】    {     $y=($x->item($i)->parentNode);    }  }}$cd=($y->childNodes);for ($i=0;$i<$cd->length;$i++){ //Process only element nodesif ($cd->item($i)->nodeType==1)  {   echo($cd->item($i)->nodeName);  echo(": ");  echo($cd->item($i)->childNodes->item(0)->nodeValue);  echo("<br />");  } }?>
【注释1】 如果节点是元素节点,则nodeType属性返回的是1;如果是属性节点,则nodeType属性返回的是2。通过这方法排除掉非元素节点。$x获取到的是ARTIST节点数组,因为真个xml文件有多个ARTIST节点,所以要用item(index)来确定当前是哪个ARTIST节点(按出现顺序排列)。$x->item(0)表示第一个出现的ARTIST标签。【注释2】   第$i+1个ARTIST节点的子节点是文本,所以nodeValue就是对应的文本内容。PHP用DOMDocument解析xml文件


例子2:Me.xml 
<?xml version="1.0" encoding="utf-8"?> 
<phplamp> 
<post> 
<title id="1">PHP XML处理介绍一</title> 
<details>详细内容一</details> 
</post> 
<post> 
<title id="2">PHP XML处理介绍二</title> 
<details>详细内容二</details> 
</post> 
<post> 
<title id="3">PHP XML处理介绍三</title> 
<details>详细内容三</details> 
</post> 
</phplamp>
php
// 首先要建一个DOMDocument对象 
$xml = new DOMDocument(); 

// 加载Xml文件 
$xml->load("me.xml"); 

// 获取所有的post标签 
$postDom = $xml->getElementsByTagName("post"); 

// 循环遍历post标签 
foreach($postDom as $post){ 
// 获取Title标签Node 
$title = $post->getElementsByTagName("title"); 

/** 
* 要获取Title标签的Id属性要分两部走 
* 1. 获取title中所有属性的列表也就是$title->item(0)->attributes 
* 2. 获取title中id的属性,因为其在第一位所以用item(0) 

* 小提示: 
* 若取属性的值可以用item(*)->nodeValue 
* 若取属性的标签可以用item(*)->nodeName 
* 若取属性的类型可以用item(*)->nodeType 
*/ 
echo "Id: " . $title->item(0)->attributes->item(0)->nodeValue . "<br />"; 
echo "Title: " . $title->item(0)->nodeValue . "<br />"; 
echo "Details: " . $post->getElementsByTagName("details")->item(0)->nodeValue . "<br /><br />"; 
}




总结:使用DOMDocument解析xml文件大概方法是:1. 首先要建一个DOMDocument对象:    $xml = new DOMDocument(); 2.加载xml文件:  $xml->load("xmlfile.xml"); 3.获得对应的标签:$xml->getElementsByTagName("A");     注意:    1>此时获取到的并不是某一个具体的标签,而是这一类标签,相当于该标签数组,所以要访问那一个具体的标签,还要通过item(index)来获取到第index+1个标签。    2>通过$xml->item(insex)可以获取到某个标签,比如获得下面这个A标签:            <A  id="ia"  name="na" >                    <B1  id="b1">1 </B1>                    <B2   id="b2">2</B2>            <A>    A这个标签有两个属性和两个直接子节点。        获取某属性:$xml->item(insex)->attributes                获取第一个属性id:$xml->item(insex)->attributes->item(0);                            如果是:echo  $xml->item(insex)->attributes->item(0);   则输出结果是:id               获取属性的值:$xml->item(insex)->attributes->item(0)->nodeValue;                       如果是:echo  $xml->item(insex)->attributes->item(0)->nodeVale;   则输出结果是:ia        获取子节点:$xml->item(insex)->childNodes               获取第一个子节点B1 :$xml->item(insex)->childNodes->item(0);                        如果是:echo  $xml->item(insex)->childNodes->item(0);   则输出结果是:B1               获取属性的值:$xml->item(insex)->childNodes->item(0)->nodeValue;                       如果是:echo  $xml->item(insex)->childNodes->item(0)->nodeVale;   则输出结果是:1        但是item(1)未必就是对应这下一个标签,所以才有了例子1中的对nodeType的判断。
DOM item() 方法详解:http://www.w3school.com.cn/jsref/met_nodelist_item.aspDOM nodeType 属性http://www.w3school.com.cn/jsref/prop_node_nodetype.asp


以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件 ,以便于您获取更多的相关知识。