用sax方式的時候
要自己構建
個函數
而且要直接用這三的函數來返回數據
要求較強的邏輯
在處理不同結構的xml的時候
還要重新進行構造這三個函數
麻煩!
用dom方式
倒是好些
但是他把每個節點都看作是一個node
操作起來要寫好多的代碼
麻煩!
網上有好多的開源的xml解析的類庫
以前看過幾個
但是心裡總是覺得不踏實
感覺總是跟在別人的屁股後面
這幾天在搞java
挺累的
所以決定換換腦袋
寫點php代碼
為了防止以後xml解析過程再令我犯難
就花了一天的時間寫了下面一個xml解析的類
於是就有了下面的東西
實現方式是通過包裝
sax方式的解析結果
來實現的
總的來說
對於我個人來說挺實用的
性能也還可以
基本上可以完成大多數的處理要求
功能: 對基本的xml文件的節點進行 查詢 / 添加 / 修改 / 刪除 工作
導出xml文件的所有數據到一個數組裡面
整個設計采用了oo方式
在操作結果集的時候
使用方法類似於dom
缺點: 每個節點最好都帶有一個id(看後面的例子)
每個
節點名字
=
節點的標簽_節點的id
如果這個id值沒有設置
程序將自動給他產生一個id
這個id就是這個節點在他的上級節點中的位置編號
從
開始
查詢某個節點的時候可以通過用
|
符號連接
節點名字
來進行
這些
節點名字
都是按順序寫好的上級節點的名字
使用說明 運行下面的例子
在執行結果頁面上可以看到函數的使用說明
代碼是通過php
來實現的
在php
中無法正常運行
由於剛剛寫完
所以沒有整理文檔
下面的例子演示的只是一部分的功能
代碼不是很難
要是想知道更多的功能
可以研究研究源代碼
目錄結構: test
php
test
xml
xml / SimpleDocumentBase
php
xml / SimpleDocumentNode
php
xml / SimpleDocumentRoot
php
xml / SimpleDocumentParser
php
文件:test
xml
<?xml version=
encoding=
GB
?><shop> <name>華聯</name> <address>北京長安街-
號</address> <desc>連鎖超市</desc> <cat id=
food
> <goods id=
food
> <name>food
</name> <price>
</price> </goods> <goods id=
food
> <name>food
</name> <price>
</price> <desc creator=
hahawen
>好東西推薦</desc> </goods> </cat> <cat> <goods id=
tel
> <name>tel
</name> <price>
</price> </goods> </cat> <cat id=
coat
> <goods id=
coat
> <name>coat
</name> <price>
</price> </goods> <goods id=
coat
> <name>coat
</name> <price>
</price> </goods> </cat> <special id=
hot
> <goods> <name>hot
</name> <price>
</price> </goods> </special></shop>
文件:test
php
<?php
require_once
xml/SimpleDocumentParser
php
; require_once
xml/SimpleDocumentBase
php
; require_once
xml/SimpleDocumentRoot
php
; require_once
xml/SimpleDocumentNode
php
; $test = new SimpleDocumentParser(); $test
>parse(
test
xml
); $dom = $test
>getSimpleDocument(); echo
<pre>
; echo
<hr><font color=red>
; echo
下面是通過函數getSaveData()返回的整個xml數據的數組
; echo
</font><hr>
; print_r($dom
>getSaveData()); echo
<hr><font color=red>
; echo
下面是通過setValue()函數
給給根節點添加信息
添加後顯示出結果xml文件的內容
; echo
</font><hr>
; $dom
>setValue(
telphone
); echo htmlspecialchars($dom
>getSaveXml()); echo
<hr><font color=red>
; echo
下面是通過getNode()函數
返回某一個分類下的所有商品的信息
; echo
</font><hr>
; $obj = $dom
>getNode(
cat_food
); $nodeList = $obj
>getNode(); foreach($nodeList as $node){ $data = $node
>getValue(); echo
<font color=red>商品名
$data[name]
</font><br>
; print_R($data); print_R($node
>getAttribute()); } echo
<hr><font color=red>
; echo
下面是通過findNodeByPath()函數
返回某一商品的信息
; echo
</font><hr>
; $obj = $dom
>findNodeByPath(
cat_food|goods_food
); if(!is_object($obj)){ echo
該商品不存在
; }else{ $data = $obj
>getValue(); echo
<font color=red>商品名
$data[name]
</font><br>
; print_R($data); print_R($obj
>getAttribute()); } echo
<hr><font color=red>
; echo
下面是通過setValue()函數
給商品\
food
\
添加屬性
然後顯示添加後的結果
; echo
</font><hr>
; $obj = $dom
>findNodeByPath(
cat_food|goods_food
); $obj
>setValue(
leaveword
array(
value
=>
這個商品不錯
attrs
=>array(
author
=>
hahawen
date
=>date(
Y
m
d
)))); echo htmlspecialchars($dom
>getSaveXml()); echo
<hr><font color=red>
; echo
下面是通過removeValue()/removeAttribute()函數
給商品\
food
\
改變和刪除屬性
然後顯示操作後的結果
; echo
</font><hr>
; $obj = $dom
>findNodeByPath(
cat_food|goods_food
); $obj
>setValue(
name
new food
); $obj
>removeValue(
desc
); echo htmlspecialchars($dom
>getSaveXml()); echo
<hr><font color=red>
; echo
下面是通過createNode()函數
添加商品
然後顯示添加後的結果
; echo
</font><hr>
; $obj = $dom
>findNodeByPath(
cat_food
); $newObj = $obj
>createNode(
goods
array(
id
=>
food
)); $newObj
>setValue(
name
food
); $newObj
>setValue(
price
); echo htmlspecialchars($dom
>getSaveXml()); echo
<hr><font color=red>
; echo
下面是通過removeNode()函數
刪除商品
然後顯示刪除後的結果
; echo
</font><hr>
; $obj = $dom
>findNodeByPath(
cat_food
); $obj
>removeNode(
goods_food
); echo htmlspecialchars($dom
>getSaveXml()); ?>
文件:SimpleDocumentParser
php
<?php
/**
*=========================================================
*
* @author hahawen(大齡青年)
* @since
* @copyright Copyright (c)
NxCoder Group
*
*=========================================================
*/
/**
* class SimpleDocumentParser
* use SAX parse xml file
and build SimpleDocumentObject
* all this pachage
s is work for xml file
and method is action as DOM
*
* @package mon
xml
* @version
*/
class SimpleDocumentParser
{
private $domRootObject = null;
private $currentNO = null;
private $currentName = null;
private $currentValue = null;
private $currentAttribute = null;
public function getSimpleDocument()
{
return $this
>domRootObject;
}
public function parse($file)
{
$xmlParser = xml_parser_create();
xml_parser_set_option($xmlParser
XML_OPTION_CASE_FOLDING
);
xml_parser_set_option($xmlParser
XML_OPTION_SKIP_WHITE
);
xml_parser_set_option($xmlParser
XML_OPTION_TARGET_ENCODING
UTF
);
xml_set_object($xmlParser
$this);
xml_set_element_handler($xmlParser
startElement
endElement
);
xml_set_character_data_handler($xmlParser
characterData
);
if (!xml_parse($xmlParser
file_get_contents($file)))
die(sprintf(
XML error: %s at line %d
xml_error_string(xml_get_error_code($xmlParser))
xml_get_current_line_number($xmlParser)));
xml_parser_free($xmlParser);
}
private function startElement($parser
$name
$attrs)
{
$this
>currentName = $name;
$this
>currentAttribute = $attrs;
if($this
>currentNO == null)
{
$this
>domRootObject = new SimpleDocumentRoot($name);
$this
>currentNO = $this
>domRootObject;
}
else
{
$this
>currentNO = $this
>currentNO
>createNode($name
$attrs);
}
}
private function endElement($parser
$name)
From:http://tw.wingwit.com/Article/program/PHP/201311/20825.html