您的位置:首页 > 编程语言 > PHP开发

PHP用DOMDocument解析xml文件

2015-11-17 12:22 766 查看
例子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

<?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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: