PHP用DOMDocument解析xml文件

来源:互联网 发布:海鹰数据 wish 编辑:程序博客网 时间:2024/06/13 01:17
例子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文件分析:

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就是对应的文本内容。



例子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.asp
DOM nodeType 属性
http://www.w3school.com.cn/jsref/prop_node_nodetype.asp



1 0