コアポイント
query()
evaluate()
XPathを使用すると、コードをより簡潔で効率的にすることができます。比較テストでは、純粋なXPathを使用する速度の利点は非常に明白であり、XPathバージョンは非XPathバージョンよりも約10%高速です。 query()
DOMNodeList
PHP DOMを使用すると、カスタム関数を使用して標準のXPath関数を拡張できます。これには、PHP独自の関数をXPathクエリに統合し、XPathで使用されるPHP関数の登録が含まれます。これにより、XPathの機能が拡張され、より複雑なクエリを実行できるようになります。 evaluate()
<!DOCTYPE library [ <!ELEMENT library (book*)> <!ELEMENT book (title, author, genre, chapter*)> <!ATTLIST book isbn ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT genre (#PCDATA)> <!ELEMENT chapter (chaptitle,text)> <!ATTLIST chapter position NMTOKEN #REQUIRED> <!ELEMENT chaptitle (#PCDATA)> <!ELEMENT text (#PCDATA)> ]>
<?xml version="1.0" encoding="utf-8"?> <library> <book isbn="isbn1234"> <title>A Book</title> <author>An Author</author> <genre>Horror</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text></text> </chapter> </book> <book isbn="isbn1235"> <title>Another Book</title> <author>Another Author</author> <genre>Science Fiction</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text>Sit Dolor Amet...</text> </chapter> </book> </library>
それだけです。 2つのフォワードスラッシュは、
がドキュメントのルート要素であることを示し、単一のスラッシュはその子要素であることを示します。とてもシンプルですね。しかし、特定の本を指定したい場合はどうなりますか? 「著者」によって書かれた本を返品したいとします。 XPathは次のとおりです
book
//library/book
。どちらもクエリを実行しますが、違いは結果の結果です。 library
は常にbook
を返し、
//library/book/author[text() = "An Author"]/..
を返します。 text()
は番号を直接返すため、ノードからデータを抽出することなく、すぐに使用できます。 query()
evaluate()
query()
XPathのコードと速度の利点<
特定の著者によって書かれた本の数を返して、簡単なデモをしましょう。まず、実行可能なアプローチを検討しますが、Xpathは使用しません。これは、Xpathを使用せずにこれを行う方法と、Xpathが非常に強力である理由を示すことです。
<!DOCTYPE library [ <!ELEMENT library (book*)> <!ELEMENT book (title, author, genre, chapter*)> <!ATTLIST book isbn ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT genre (#PCDATA)> <!ELEMENT chapter (chaptitle,text)> <!ATTLIST chapter position NMTOKEN #REQUIRED> <!ELEMENT chaptitle (#PCDATA)> <!ELEMENT text (#PCDATA)> ]>
次の方法は同じ結果を達成しますが、Xpathを使用して特定の著者によってのみ書かれた本を選択します。
<?xml version="1.0" encoding="utf-8"?> <library> <book isbn="isbn1234"> <title>A Book</title> <author>An Author</author> <genre>Horror</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text></text> </chapter> </book> <book isbn="isbn1235"> <title>Another Book</title> <author>Another Author</author> <genre>Science Fiction</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text>Sit Dolor Amet...</text> </chapter> </book> </library>
を使用して、このパスの発生数を計算できます。 count()
//library/book
が使用されていることに注意してください。これは、関数evaluate()
が型付けされた結果を返すためです。 count()
を使用するとquery()
が返されますが、空のリストであることがわかります。これにより、コードがより簡潔になるだけでなく、速度の利点もあります。バージョン1の平均速度はバージョン2よりも30%高速であることがわかりましたが、バージョン3はバージョン2よりも約10%高速です(バージョン1よりも約15%高速)。これらの測定値はサーバーとクエリに基づいて異なりますが、純粋なXPathを使用すると、かなりの速度の利点がもたらされ、コードが読みやすくなり、メンテナンスが容易になります。 DOMNodeList
xpath関数
XPathはかなり多くの機能を使用でき、利用可能な機能を詳述する多くの優れたリソースがあります。またはDOMNodeLists
を比較しているかどうかを繰り返している場合、多くのPHPコードを排除するXPath関数を見つけることができます。 nodeValues
関数の使用が見られました。指定されたISBNで本のタイトルを返すためにcount()
関数を使用しましょう。使用する必要があるXpath式は次のとおりです
id()
//library/book/author[text() = "An Author"]/..
XPathで複雑な関数を実行することは比較的簡単です。
<?php public function getNumberOfBooksByAuthor($author) { $total = 0; $elements = $this->domDocument->getElementsByTagName("author"); foreach ($elements as $element) { if ($element->nodeValue == $author) { $total++; } } return $total; // 修正:这里应该是 $total,而不是 $number } ?>
でphp関数を使用しています 標準のXPath関数が提供できない、より強力な機能が必要になることがある場合があります。幸いなことに、PHP DOMを使用すると、PHP独自の機能をXPathクエリに統合することもできます。本のタイトルにある単語の数を返すことを考えてみましょう。最も単純な関数、このような方法を書くことができます:
<!DOCTYPE library [ <!ELEMENT library (book*)> <!ELEMENT book (title, author, genre, chapter*)> <!ATTLIST book isbn ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT genre (#PCDATA)> <!ELEMENT chapter (chaptitle,text)> <!ATTLIST chapter position NMTOKEN #REQUIRED> <!ELEMENT chaptitle (#PCDATA)> <!ELEMENT text (#PCDATA)> ]>
ただし、関数をxpathクエリに直接統合することもできます。これにはいくつかの手順を完了する必要があります。まず、XPathオブジェクトを使用して名前空間を登録する必要があります。 XPathクエリのPHP関数は「str_word_count()
」で始まり、その後に使用する関数の名前が括弧で囲まれています。さらに、定義する名前空間はphp:functionString
です。名前空間はこれに設定する必要があります。次に、http://php.net/xpath
を呼び出す必要があります。これは、名前空間として「registerPHPFunctions()
」で関数に遭遇するたびに、PHPで処理する必要があることをPHPに伝えます。関数を呼び出すための実際の構文は次のとおりです
php:
<?xml version="1.0" encoding="utf-8"?> <library> <book isbn="isbn1234"> <title>A Book</title> <author>An Author</author> <genre>Horror</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text></text> </chapter> </book> <book isbn="isbn1235"> <title>Another Book</title> <author>Another Author</author> <genre>Science Fiction</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text>Sit Dolor Amet...</text> </chapter> </book> </library>
getNumberOfWords()
ノードのテキストを提供するには、xpath関数を呼び出す必要はないことに注意してください。
//library/book
登録PHP関数は、PHPに付属する関数に限定されません。独自の関数を定義し、Xpathで提供できます。唯一の違いは、関数を定義するときに、「text()
」の代わりに「registerPHPFunctions()
」を使用することです。さらに、関数自体または静的メソッドのみを提供できます。呼び出しインスタンスメソッドはサポートされていません。クラスの範囲を超えた通常の機能を使用して、基本的な機能を実証しましょう。使用する関数は、「ジョージオーウェル」の本のみを返します。クエリに含める各ノードについては、
//library/book/author[text() = "An Author"]/..
php:function
関数に渡された引数は、php:functionString
の配列です。この関数は、配列を反復し、テストするノードをtrue
で返す必要があるかどうかを判断する責任があります。この例では、テストするノードは
<?php public function getNumberOfBooksByAuthor($author) { $total = 0; $elements = $this->domDocument->getElementsByTagName("author"); foreach ($elements as $element) { if ($element->nodeValue == $author) { $total++; } } return $total; // 修正:这里应该是 $total,而不是 $number } ?>
DOMElements
DOMNodeList
実際には、これらの機能はすべてXpathのみで簡単に記述できますが、この例はXPathクエリを拡張してより複雑にする方法を示しています。 Xpathではオブジェクトメソッドを呼び出すことはできません。 XPathクエリを完了するために特定のオブジェクトプロパティまたはメソッドにアクセスする必要があることがわかった場合、最良の解決策はXPathを使用してできる部品を完成させ、任意のオブジェクトメソッドまたは属性を使用して、必要に応じて生成された/book
を処理することです。 。 /author
getGeorgeOrwellBooks()
<?php public function getNumberOfBooksByAuthor($author) { $query = "//library/book/author[text() = '$author']/.."; $xpath = new DOMXPath($this->domDocument); $result = $xpath->query($query); return $result->length; } ?>
compare()
XPathは、XMLデータを処理するときに書き込まれたコードの量を減らし、コード実行をスピードアップする素晴らしい方法です。公式DOM仕様の一部ではありませんが、PHP DOMが提供する追加機能により、カスタム関数を使用して標準のXPath関数を拡張できます。これは非常に強力な機能であり、Xpath関数に精通するにつれて、あなたはそれに頼ることをますます頼りにするかもしれません。
(フォトリアからの写真)
XPath(XML PATH言語)は、XMLドキュメントからノードを選択するために使用されるクエリ言語です。 PHP DOMでは、XPATHはXMLドキュメントで要素とプロパティを通過するために使用されます。名前でノードを選択したり、属性値でノードを選択したり、ドキュメント内の場所でノードを選択したりするなど、XMLドキュメントの特定の部分をさまざまな方法で見つけて選択できます。これにより、PHPでXMLデータを解析および操作するための強力なツールになります。
domxPathのインスタンスを作成するには、最初にdomdocumentクラスのインスタンスを作成する必要があります。 DomDocumentオブジェクトを取得したら、DomdocumentオブジェクトをDomxPathコンストラクターに渡すことにより、新しいDomxPathオブジェクトを作成できます。例は次のとおりです。
<!DOCTYPE library [ <!ELEMENT library (book*)> <!ELEMENT book (title, author, genre, chapter*)> <!ATTLIST book isbn ID #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT genre (#PCDATA)> <!ELEMENT chapter (chaptitle,text)> <!ATTLIST chapter position NMTOKEN #REQUIRED> <!ELEMENT chaptitle (#PCDATA)> <!ELEMENT text (#PCDATA)> ]>
domxPathオブジェクトのquery()
メソッドを使用してノードを選択できます。 query()
メソッドは、XPath式をパラメーターとして受け取り、式に一致するすべてのノードを含むドムノデリストオブジェクトを返します。たとえば、
<?xml version="1.0" encoding="utf-8"?> <library> <book isbn="isbn1234"> <title>A Book</title> <author>An Author</author> <genre>Horror</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text></text> </chapter> </book> <book isbn="isbn1235"> <title>Another Book</title> <author>Another Author</author> <genre>Science Fiction</genre> <chapter position="first"> <chaptitle>chapter one</chaptitle> <text>Sit Dolor Amet...</text> </chapter> </book> </library>
これにより、<book>
要素の子要素であるすべての要素が選択されます。 <title>
query()
evaluate()
およびメソッドは、XPath式に一致するすべてのノードのドムノデリストを返します。一方、 XPathを使用してプロパティを選択する方法は?
はい、PHP DOMのHTMLドキュメントでXPathを使用できます。ただし、HTMLは必ずしも十分に形成されたXMLであるとは限らないため、XPathをHTMLで使用しようとするのに問題がある場合があります。これらの問題を回避するために、domdocumentクラスの PHP DOMでXPathを使用する場合、誤ったXPath式形式やXMLドキュメントなど、いくつかの理由でエラーが発生する可能性があります。これらのエラーを処理するには、 XPath自体はXMLドキュメントを変更する方法を提供していませんが、XPATHをDOM APIで使用してXMLドキュメントを変更できます。 XPathを使用して変更するノードを選択し、DOM APIによって提供されるメソッドを使用して変更できます。たとえば、Domnodeクラスの 以上がPHP DOM:XPathを使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。query()
は、XPath式に応じて、ブール値、数字、または文字列などの入力された結果を返します。式の結果がノードセットの場合、evaluate()
はdomnodelistを返します。 query()
evaluate()
XPathクエリで名前空間を処理する方法は? evaluate()
registerNamespace()
//library/book
プロパティを選択するには、次のxpath式:
を使用できます。 @
php domでxpath関数を使用する方法は? <a></a>
href
XPathは、XPath式で使用できる多くの機能を提供します。これらの関数は、文字列、数字、ノードセットなどを操作するために使用できます。 php domでxpath関数を使用するには、xpath式に関数を含めるだけです。たとえば、値が30を超える価格要素を持つすべての//a/@href
要素を選択するには、以下に示すように
PHP DOMのHTMLドキュメントでXPathを使用できますか?
loadHTML()
メソッドを使用してHTMLドキュメントをロードできます。このメソッドはHTMLを解析し、任意のフォーマットエラーを修正し、生成されたDomdocumentオブジェクトでXPathを使用できます。 php domでxpathを使用するときにエラーを処理する方法は?
libxml_use_internal_errors()
関数を使用してユーザーエラー処理を有効にすることができます。この機能により、LIBXMLエラーが内部に保存され、コードでそれらを処理できます。その後、libxml_get_errors()
関数を使用してエラーを取得し、必要に応じてそれらを処理できます。 php domのxpathを使用してxmlドキュメントを変更できますか?
removeChild()
メソッドを使用してノードを削除するか、ドメレメントクラスのsetAttribute()
メソッドを使用して属性の値を変更できます。