質問

元の質問は以下のとおりですが、同じ疑問を持つ他の人を見つける方が簡単になると思うので、タイトルを変更しました。最終的に、XHTMLドキュメントはXMLドキュメントです。

これは初心者の質問ですが、PHP5でXHTMLドキュメントを解析するのに最適なライブラリはどれだと思いますか?

Tidyを使用してHTMLファイル(Word:Sを使用して作成)からXHTMLを生成し、それらの一部の要素(and要素など、

の一部の属性を置換する必要があることを知っています)タグ)。

XMLをあまり使用していません。PHPで解析するための多くのオプション(単純なXML、DOMなど)があり、それらすべてが必要なことを実行できるかどうかわかりません。最も使いやすいもの。

英語はすみません、アルゼンチンです。ありがとう!

もう少し情報: Word 97で作成したHTMLページがたくさんあります。XHTMLStrictでそれらをクリーニングして回転させるためにTidyを使用したため、現在はすべてXML互換です。 XMLパーサーを使用していくつかの要素を見つけ、それらを置き換えます(これを実行するロジックは重要ではありません)。たとえば、統一された外観のために、すべてのページで同じCSSスタイルシートとクラス属性を使用する必要があります。それらはすべて法的文書を含む静的なページであり、奇妙なことは何もありません。どの拡張機能を使用する必要がありますか? SimpleXMLで十分ですか?もっと難しいのにDOMを学ぶべきですか?

役に立ちましたか?

解決

ここで混乱を解消するだけです。 PHPには多くのXMLライブラリがあります。これは、php4がその方向に非常に優れたオプションを持っていなかったためです。 PHP5からは、 SimpleXml DOM および saxベースのexpatパーサー。後者はphp4にも存在していました。 php4にはDOM拡張もありました。これはphp5のではありません

DOMとSimpleXmlは、同じ問題ドメインの代替です。ドキュメントをメモリにロードし、ツリー構造としてアクセスできるようにします。 DOMはかなりかさばるapiですが、非常に一貫性があり、多くの言語で実装されているため、言語間で知識を再利用できます(Javascriptなど)。 SimpleXmlは最初は簡単かもしれません。

SAXパーサーは別の獣です。 XMLドキュメントをタグのストリームとして扱います。非常に大きなドキュメントを扱う場合、これをすべてメモリに保持する必要がないため便利です。

使用方法としては、おそらくDOM APIを使用します。

他のヒント

SimpleXML を使用できます。これは、デフォルトのPHPインストールに含まれています。この拡張機能は、XML構造へのオブジェクト指向の簡単なアクセスを提供します。

DOM XML もあります。 「マイナス面」この拡張機能は、使用するのが少し難しく、デフォルトで含まれていないということです。

  • DOM は、W3Cによって標準化されたXMLなどの階層データ用の、言語に依存しない標準APIです。これは、多くの機能を備えた豊富なAPIです。各ノードがオブジェクトであるという点で、オブジェクトベースです。

    DOMは、読み取りまたは書き込みだけでなく、他のノードへのノードの挿入、構造の変更など、既存のドキュメントのノードの多くの操作を行いたい場合に適しています。

  • SimpleXML はPHP固有のAPIであり、オブジェクトベースでもありますが、DOMよりも「簡潔」になります:値の検索などの単純なタスクノードまたはその子要素の検索に必要なコードははるかに少なくなります。そのAPIはDOMほどリッチではありませんが、XPathルックアップなどの機能や、複数のネームスペースドキュメントを操作する基本的な機能が含まれています。そして、重要なことは、XML CDATAセクションやコメントなど、ドキュメントを操作するための関数が含まれていなくても、ドキュメントのすべての機能を保持していることです。

    SimpleXMLは読み取り専用に非常に適しています。XMLドキュメントを読み取り、それを別のフォームに変換するだけであれば、多くのコードを節約できます。また、ドキュメントを生成したり、子要素や属性を追加または変更するなどの基本的な操作を行う場合もかなり便利ですが、既存のドキュメントを大量に操作することは複雑になる可能性があります(不可能ではありません)。たとえば、2つの他の要素の間に子要素を追加するのは簡単ではありません。 addChildは、他の要素の後にのみ挿入します。 SimpleXMLはXSLT変換も実行できません。 「getElementsByTagName」や「getElementById」のようなものはありませんが、XPathを知っていれば、SimpleXMLでそのようなことができます。

    SimpleXMLElementオブジェクトはやや「魔法」です。 var_dump / printr / var_exportが公開するプロパティは、完全な内部表現に対応していません。 ->でアクセスできるプロパティであるかのように、子要素の一部を公開します。演算子を使用しますが、ドキュメント全体を内部的に保持します。名前が予約語である子要素には、連想配列であるかのように[]演算子を使用してアクセスできます。

PHPが以下の機能を実装しているため、どちらかに完全にコミットする必要はありません。

  • simplexml_import_dom(DOMNode)
  • dom_import_simplexml(SimpleXMLElement)

これは、SimpleXMLを使用していて、DOMノードまたはその逆を期待するコードを使用する必要がある場合に役立ちます。

PHPは、3番目のXMLライブラリも提供しています。

  • XMLパーサー SAX の実装、言語に依存しないインターフェースですが、マニュアルではその名前で参照されていません)ははるかに低いレベルですライブラリは、まったく異なる目的を果たします。オブジェクトをビルドしません。基本的には、次のトークンに進み、タグ名とは何か、開始タグか終了タグかなどのトークンのタイプを見つける作業を行うため、独自のXMLパーサーの作成が簡単になります。 。次に、トークンが検出されるたびに実行されるコールバックを記述する必要があります。 XMLパーサーでできるのは低レベルのパーサーを書くだけなので、ドキュメントをツリー内のオブジェクト/配列として表す、ドキュメントを操作するなどのすべてのタスクを個別に実装する必要があります。

    特定のメモリまたは速度の要件がある場合、XMLパーサー関数は非常に役立ちます。これにより、すべてのコンテンツを一度にメモリに保持することなく、非常に長いXMLドキュメントを解析できるパーサーを作成することができます。また、すべてのデータに興味がなく、ツリーまたはPHPオブジェクトのセットに入れる必要がない場合、またはデータをPHPオブジェクトのセットに入れる必要がない場合は、より高速になります。たとえば、XHTMLドキュメントをスキャンしてすべてのリンクを検索する場合、構造は気にしません。<

私は SimpleXMLElement を好みます。要素を通して。

編集:使用可能なバージョン情報はありませんが、PHP5では使用可能です。少なくとも5.2.5ですが、おそらくそれ以前です。

それは本当に個人的な選択ですが、 XML拡張機能がたくさんあります。

無効なマークアップがある場合、多くのXMLパーサーが動作しないことに注意してください-XHTMLはXMLである必要がありますが、常にそうではありません!

PHPでXML解析を行ってから長い時間(2年以上)がありますが、 XML_Parser Pearパッケージ。そうは言っても、PHP5への露出は最小限に抑えられているので、最近、より良い組み込みの代替案があるかどうかはわかりません。

昨年、PHP5で少しXML解析を行い、SimpleXMLの組み合わせを使用することにしました。

DOMは、新しいXMLツリーを作成したり、既存のXMLツリーに追加したりする場合に少し便利です。少し柔軟性があります。

それは本当にあなたが何を達成しようとしているかに依存します。 かなり大量のデータ、つまりストアのWebサイトからの製品情報などの多くのレコードをプルするには、Expatを使用します。 個人的には、顕著なパフォーマンスの向上をもたらすのに十分な大きさのXMLを持っています。 これらの数量では、SQLを使用することもできます。

SimpleXMLの使用をお勧めします。 それは非常に直感的で、使用/書き込みが簡単です。 また、XPathでも問題なく動作します。

DOMを実際にあまり使用する必要はありませんが、XMLパーサーを説明しているような大きなものに使用している場合は、SimpleXMLよりも少し機能的であるため、使用することをお勧めします。

W3Cスクールで3つすべてについて読むことができます:

http://www.w3schools.com/php/php_xml_parser_expat.asp

http://www.w3schools.com/php/php_xml_simplexml.asp

http://www.w3schools.com/php/php_xml_dom.asp

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top