ホームページ > php教程 > php手册 > PHP 5.0 を使用して XML ドキュメントを簡単に解析する (1)

PHP 5.0 を使用して XML ドキュメントを簡単に解析する (1)

WBOY
リリース: 2016-06-21 09:15:18
オリジナル
1037 人が閲覧しました

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
ログイン後にコピー
ファイル:test.xml

<?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>
ログイン後にコピー

ファイル:test.php

  <?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>  ?>
ログイン後にコピー



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート