的時候,要自己構建3個函數,而且要直接用這三的函數來返回數據, 要求較強的邏輯。 在處理不同結構的XML的時候, 還要重新進行構造這三個函數,麻煩!
用dom方式,倒是好些,但是他把每個節點都看作是一個node,操作起來要寫好多的代碼, 麻煩!
網上有好多的開源的XML解析的類庫, 以前看過幾個,但是心裡總是覺得不踏實,感覺總是跟在別人的屁股後面.
這幾天在搞Java, 挺累的,所以決定換換腦袋,寫點PHP代碼,為了防止以後xml解析過程再令我犯難,就花了一天的時間寫了下面一個XML解析的類,於是就有了下面的東西。
實現方式是通過包裝"sax方式的解析結果"來實現的. 總的來說,對於我個人來說挺實用的,性能也還可以,基本上可以完成大多數的處理要求。
功能:
1、 對基本的XML文件的節點進行 查詢 / 添加 / 修改 / 刪除 工作.
2、導出XML文件的所有數據到一個數組裡面.
3、整個設計采用了oo方式,在操作結果集的時候, 使用方法類似於dom
缺點:
1、 每個節點最好都帶有一個id(看後面的例子), 每個“節點名字”=“節點的標簽_節點的id”,如果這個id值沒有設置,程序將自動給他產生一個id,這個id就是這個節點在他的上級節點中的位置編號,從0開始。
2、 查詢某個節點的時候可以通過用“|”符號連接“節點名字”來進行。這些“節點名字”都是按順序寫好的上級節點的名字。
使用說明:
運行下面的例子,在執行結果頁面上可以看到函數的使用說明
代碼是通過php5來實現的,在PHP4中無法正常運行。
由於剛剛寫完,所以沒有整理文檔,下面的例子演示的只是一部分的功能,代碼不是很難,要是想知道更多的功能,可以研究研究源代碼。
目錄結構:
文件:test.XML
<?XML version="1.0" encoding="GB2312"?>
<shop>
<name>華聯</name>
<address>北京長安街-9999號</address>
<desc>連鎖超市</desc>
<cat id="food">
<goods id="food11">
<name>food11</name>
<price>12.90</price>
</goods>
<goods id="food12">
<name>food12</name>
<price>22.10</price>
<desc creator="hahawen">好東西推薦</desc>
</goods>
</cat>
<cat>
<goods id="tel21">
<name>tel21</name>
<price>1290</price>
</goods>
</cat>
<cat id="coat">
<goods id="coat31">
<name>coat31</name>
<price>112</price>
</goods>
<goods id="coat32">
<name>coat32</name>
<price>45</price>
</goods>
</cat>
<special id="hot">
<goods>
<name>hot41</name>
<price>99</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", "123456789");
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_food11");
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()函數,給商品\"food11\"添加屬性, 然後顯示添加後的結果";
echo "</font><hr>";
$obj = $dom->findNodeByPath("cat_food|goods_food11");
$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()函數,
給商品\"food11\"改變和刪除屬性, 然後顯示操作後的結果";
echo "</font><hr>";
$obj = $dom->findNodeByPath("cat_food|goods_food12");
$obj->setValue("name", "new food12");
$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"=>"food13"));
$newObj->setValue("name", "food13");
$newObj->setValue("price", 100);
echo Htmlspecialchars($dom->getSaveXML());
echo "<hr><font color=red>";
echo "下面是通過removeNode()函數,刪除商品, 然後顯示刪除後的結果";
echo "</font><hr>";
$obj = $dom->findNodeByPath("cat_food");
$obj->removeNode("goods_food12");
echo Htmlspecialchars($dom->getSaveXML());
?>