例子1:
- 循环所有 "artist" 元素 (nodetypes = 1),查找与 JavaScript 所传数据向匹配的名字
- 找到 CD 包含的正确 artist
- 输出 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文件:
步骤:
- 循环所有 "artist" 元素 (nodetypes = 1),查找与 JavaScript 所传数据向匹配的名字
- 找到 CD 包含的正确 artist
- 输出 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 nodes if ($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 nodes if ($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
php
<?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> |
// 首先要建一个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() 方法详解:
DOM nodeType 属性