xml
sax メソッドを使用する場合、3 つの関数を自分で構築する必要があり、これら 3 つの関数を直接使用してデータを返す必要があるため、強力なロジックが必要です。 構造の異なる XML を処理する場合、これら 3 つの関数を再構築する必要があり、面倒です!
DOM メソッドを使用する方が優れていますが、各ノードをノードとして扱うため、それを操作するために多くのコードを記述する必要があります。 、問題です
インターネット上にはオープンソースの XML 解析クラス ライブラリがいくつかありますが、いつも不安を感じていて、いつも他の人に倣っているようです
最近は Java に取り組んでいます。これは非常に面倒だったので、今後 XML 解析プロセスで再び問題が発生するのを防ぐために、考えを変えて PHP コードを書くことにしました。次の XML 解析クラスを作成するのに 1 日を費やしました。もの。
実装は「saxモードでの解析結果」をパッケージ化することで実現されており、個人的にはかなり実用的で、パフォーマンスも問題なく、基本的にはほとんどの処理要件を満たせます。
機能:
1. 基本xmlファイルのノードをクエリ/追加/変更/削除します。
2. xmlファイルのすべてのデータを配列にエクスポートします。
3.全体の設計はooメソッドを採用しています、結果セットを操作する場合、使用方法は dom に似ています
欠点:
1. 各ノードに ID を持たせるのが最善です (以下の例を参照)、各 "ノード名" = "ノード label_ "Node ID"。この ID 値が設定されていない場合、プログラムはその ID を自動的に生成します。この ID は、0 から始まる上位ノード内のこのノードの位置番号です。
2. ノードをクエリする場合、「ノード名」を「|」記号で接続できます。この「ノード名」は、上位ノードの名前を順に記載したものである。
使用説明:
以下の例を実行すると、実行結果ページで関数の使用説明が表示されます
コードはphp5で実装されており、php4では正しく実行できません。
まだ書き終えたばかりなので、まだ文書を整理していません。以下の例は機能の一部を示しているだけです。さらに詳しい機能を知りたい場合は、ソースコードを参照してください。
ディレクトリ構造:
test.php test.xml xml / SimpleDocumentBase.php xml / SimpleDocumentNode.php xml / SimpleDocumentRoot.php xml / SimpleDocumentParser.php
<?xml version="1.0" encoding="GB2312"?><br><shop><br> <name>华联</name><br> <address>北京长安街-9999号</address><br> <desc>连锁超市</desc><br> <cat id="food"><br> <goods id="food11"><br> <name>food11</name><br> <price>12.90</price><br> </goods><br> <goods id="food12"><br> <name>food12</name><br> <price>22.10</price><br> <desc creator="hahawen">好东西推荐</desc><br> </goods><br> </cat><br> <cat><br> <goods id="tel21"><br> <name>tel21</name><br> <price>1290</price><br> </goods><br> </cat><br> <cat id="coat"><br> <goods id="coat31"><br> <name>coat31</name><br> <price>112</price><br> </goods><br> <goods id="coat32"><br> <name>coat32</name><br> <price>45</price><br> </goods><br> </cat><br> <special id="hot"><br> <goods><br> <name>hot41</name><br> <price>99</price><br> </goods><br> </special><br></shop>
<?php require_once "xml/SimpleDocumentParser.php";<br> require_once "xml/SimpleDocumentBase.php";<br> require_once "xml/SimpleDocumentRoot.php";<br> require_once "xml/SimpleDocumentNode.php";<br> $test = new SimpleDocumentParser();<br> $test->parse("test.xml");<br> $dom = $test->getSimpleDocument();<br> echo "<pre>";<br> echo "<hr><font color=red>";<br> echo "下面是通过函数getSaveData()返回的整个xml数据的数组";<br> echo "</font><hr>";<br> print_r($dom->getSaveData());<br> echo "<hr><font color=red>";<br> echo "下面是通过setValue()函数,给给根节点添加信息,添加后显示出结果xml文件的内容";<br> echo "</font><hr>";<br> $dom->setValue("telphone", "123456789");<br> echo htmlspecialchars($dom->getSaveXml());<br> echo "<hr><font color=red>";<br> echo "下面是通过getNode()函数,返回某一个分类下的所有商品的信息";<br> echo "</font><hr>";<br> $obj = $dom->getNode("cat_food");<br> $nodeList = $obj->getNode();<br> foreach($nodeList as $node){<br> $data = $node->getValue();<br> echo "<font color=red>商品名:".$data[name]."</font><br>";<br> print_R($data);<br> print_R($node->getAttribute());<br> }<br> echo "<hr><font color=red>";<br> echo "下面是通过findNodeByPath()函数,返回某一商品的信息";<br> echo "</font><hr>";<br> $obj = $dom->findNodeByPath("cat_food|goods_food11");<br> if(!is_object($obj)){<br> echo "该商品不存在";<br> }else{<br> $data = $obj->getValue();<br> echo "<font color=red>商品名:".$data[name]."</font><br>";<br> print_R($data);<br> print_R($obj->getAttribute());<br> }<br> echo "<hr><font color=red>";<br> echo "下面是通过setValue()函数,给商品\"food11\"添加属性, 然后显示添加后的结果";<br> echo "</font><hr>";<br> $obj = $dom->findNodeByPath("cat_food|goods_food11");<br> $obj->setValue("leaveword", array("value"=>"这个商品不错",<br> "attrs"=>array("author"=>"hahawen", "date"=>date('Y-m-d'))));<br> echo htmlspecialchars($dom->getSaveXml());<br> echo "<hr><font color=red>";<br> echo "下面是通过removeValue()/removeAttribute()函数,<br> 给商品\"food11\"改变和删除属性, 然后显示操作后的结果";<br> echo "</font><hr>";<br> $obj = $dom->findNodeByPath("cat_food|goods_food12");<br> $obj->setValue("name", "new food12");<br> $obj->removeValue("desc");<br> echo htmlspecialchars($dom->getSaveXml());<br> echo "<hr><font color=red>";<br> echo "下面是通过createNode()函数,添加商品, 然后显示添加后的结果";<br> echo "</font><hr>";<br> $obj = $dom->findNodeByPath("cat_food");<br> $newObj = $obj->createNode("goods", array("id"=>"food13"));<br> $newObj->setValue("name", "food13");<br> $newObj->setValue("price", 100);<br> echo htmlspecialchars($dom->getSaveXml());<br> echo "<hr><font color=red>";<br> echo "下面是通过removeNode()函数,删除商品, 然后显示删除后的结果";<br> echo "</font><hr>";<br> $obj = $dom->findNodeByPath("cat_food");<br> $obj->removeNode("goods_food12");<br> echo htmlspecialchars($dom->getSaveXml());<br> ?>