目次
XPathとは何ですか?PHP DOMでどのように機能しますか?
domxpathのインスタンスを作成する方法は?
xpathを使用してノードを選択する方法は?
プロパティを選択するには、次のxpath式:
PHP DOMのHTMLドキュメントでXPathを使用できますか?
php domでxpathを使用するときにエラーを処理する方法は?
php domのxpathを使用してxmlドキュメントを変更できますか?

PHP DOM:XPathを使用します

Feb 26, 2025 am 09:07 AM

PHP DOM: Using XPath

コアポイント

  • XPathは、機能を書き込むためのよりシンプルでクリーンな方法を提供し、クエリを書き込み、XMLデータをフィルターするために必要なコードの量を減らすXMLドキュメントをクエリするための構文です。
  • XPathクエリは、2つの関数を使用して実行できます。どちらもクエリを実行しますが、違いは結果の結果が返されることです。 query() evaluate() XPathを使用すると、コードをより簡潔で効率的にすることができます。比較テストでは、純粋なXPathを使用する速度の利点は非常に明白であり、XPathバージョンは非XPathバージョンよりも約10%高速です。 query() DOMNodeListPHP DOMを使用すると、カスタム関数を使用して標準のXPath関数を拡張できます。これには、PHP独自の関数をXPathクエリに統合し、XPathで使用されるPHP関数の登録が含まれます。これにより、XPathの機能が拡張され、より複雑なクエリを実行できるようになります。 evaluate()
  • この記事では、その機能とPHPでの実装方法を含め、XPathを詳細に調査します。 Xpathは、クエリを書き込み、XMLデータをフィルタリングするために必要なコードの量を大幅に削減し、一般的にパフォーマンスを改善できることがわかります。以前の投稿から同じDTDとXMLを使用して、PHP Dom XPath機能を実証します。簡単なレビューのために、DTDとXMLがどのように見えるかを次に示します。
基本的なxpath query

<!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ドキュメントを照会するための構文です。最も簡単な形式は、アクセスする要素へのパスを定義することです。上記のXMLドキュメントを使用して、次の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>
要素のコレクションを返します:

それだけです。 2つのフォワードスラッシュは、

がドキュメントのルート要素であることを示し、単一のスラッシュはその子要素であることを示します。とてもシンプルですね。しかし、特定の本を指定したい場合はどうなりますか? 「著者」によって書かれた本を返品したいとします。 XPathは次のとおりです

book

を使用して、角括弧内のノードの値の比較を実行できます。 XPathクエリは、2つの関数のいずれかを使用して実行できます:
//library/book
および

。どちらもクエリを実行しますが、違いは結果の結果です。 libraryは常にbookを返し、

はできるだけ入力された結果を返します。たとえば、Xpathのクエリが実際の本自体ではなく特定の著者によって書かれた本の数を返した場合、
//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>
今回は、PHPが著者の値をテストする必要性を排除したことに注意してください。ただし、さらに一歩進んで、XPath関数

を使用して、このパスの発生数を計算できます。 count()

//library/book
PHPを使用して面倒なフィルタリングを実行する必要なく、必要な情報を取得するためにXpathの1行のみが必要です。実際、これはこの機能を書くためのより簡単で簡潔な方法です!最後の例では

が使用されていることに注意してください。これは、関数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
}
?>

xpath

で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
}
?>

が静的な方法である場合、xpath queryを変更して読む必要があります。 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関数に精通するにつれて、あなたはそれに頼ることをますます頼りにするかもしれません。

(フォトリアからの写真)

faq(faq)xpath

XPathとは何ですか?PHP DOMでどのように機能しますか?

XPath(XML PATH言語)は、XMLドキュメントからノードを選択するために使用されるクエリ言語です。 PHP DOMでは、XPATHはXMLドキュメントで要素とプロパティを通過するために使用されます。名前でノードを選択したり、属性値でノードを選択したり、ドキュメント内の場所でノードを選択したりするなど、XMLドキュメントの特定の部分をさまざまな方法で見つけて選択できます。これにより、PHPでXMLデータを解析および操作するための強力なツールになります。

domxpathのインスタンスを作成する方法は?

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)>
]>

xpathを使用してノードを選択する方法は?

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>

domxpathのメソッドの違いは何ですか?

xpath式の評価には、query()evaluate()および

メソッドの両方が使用されます。違いは、彼らが返す結果のタイプです。

メソッドは、XPath式に一致するすべてのノードのドムノデリストを返します。一方、query()は、XPath式に応じて、ブール値、数字、または文字列などの入力された結果を返します。式の結果がノードセットの場合、evaluate()はdomnodelistを返します。 query() evaluate() XPathクエリで名前空間を処理する方法は? evaluate() メソッドを使用してDomxPathオブジェクトに名前空間を登録する必要があります。この方法には、プレフィックスと名前空間URIの2つのパラメーターがあります。名前空間を登録した後、XPathクエリでプレフィックスを使用できます。たとえば、

XPathを使用してプロパティを選択する方法は? registerNamespace()

シンボルを使用してプロパティ名を使用して、XPathでプロパティを選択できます。たとえば、
//library/book
要素のすべての

プロパティを選択するには、次のxpath式:

を使用できます。

@ php domでxpath関数を使用する方法は? <a></a> href XPathは、XPath式で使用できる多くの機能を提供します。これらの関数は、文字列、数字、ノードセットなどを操作するために使用できます。 php domでxpath関数を使用するには、xpath式に関数を含めるだけです。たとえば、値が30を超える価格要素を持つすべての//a/@href要素を選択するには、以下に示すように

関数を使用できます。

PHP DOMのHTMLドキュメントでXPathを使用できますか?

はい、PHP DOMのHTMLドキュメントでXPathを使用できます。ただし、HTMLは必ずしも十分に形成されたXMLであるとは限らないため、XPathをHTMLで使用しようとするのに問題がある場合があります。これらの問題を回避するために、domdocumentクラスのloadHTML()メソッドを使用してHTMLドキュメントをロードできます。このメソッドはHTMLを解析し、任意のフォーマットエラーを修正し、生成されたDomdocumentオブジェクトでXPathを使用できます。

php domでxpathを使用するときにエラーを処理する方法は?

PHP DOMでXPathを使用する場合、誤ったXPath式形式やXMLドキュメントなど、いくつかの理由でエラーが発生する可能性があります。これらのエラーを処理するには、libxml_use_internal_errors()関数を使用してユーザーエラー処理を有効にすることができます。この機能により、LIBXMLエラーが内部に保存され、コードでそれらを処理できます。その後、libxml_get_errors()関数を使用してエラーを取得し、必要に応じてそれらを処理できます。

php domのxpathを使用してxmlドキュメントを変更できますか?

XPath自体はXMLドキュメントを変更する方法を提供していませんが、XPATHをDOM APIで使用してXMLドキュメントを変更できます。 XPathを使用して変更するノードを選択し、DOM APIによって提供されるメソッドを使用して変更できます。たとえば、DomnodeクラスのremoveChild()メソッドを使用してノードを削除するか、ドメレメントクラスのsetAttribute()メソッドを使用して属性の値を変更できます。

以上がPHP DOM:XPathを使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

暗号通貨の計算の取り扱い:PHPにBCMATHが不可欠である理由 暗号通貨の計算の取り扱い:PHPにBCMATHが不可欠である理由 Aug 01, 2025 am 07:48 AM

bcmathisentialforAccuratecurateptocurrencycalcatulationsinphpbecuseating-pointarithmeticincecceptesuncectesubleroundingErrors.1..2 Yieldimimpreciseresults(e.g.、0.300000000000000000000000000precyptowsyptowyprectoyptoyprecyptoyprecyptoyppowsyptowprecyptowprecyptowprecyptowprecyptowprecyptowprecyptowprecyptowpreciseResults)

バリューオブジェクトとしての文字列:ドメイン固有の文字列タイプへの最新のアプローチ バリューオブジェクトとしての文字列:ドメイン固有の文字列タイプへの最新のアプローチ Aug 01, 2025 am 07:48 AM

rawStringsindomain-drivenApplicationsは、ValueObjedStopReventBugsAndimproveTypeTytyのValueObue obue obue obtedsopreated; 1. 1.SustoprimiteObsessionを使用します

データスクレイピングとWebオートメーションにPHPを使用します データスクレイピングとWebオートメーションにPHPを使用します Aug 01, 2025 am 07:45 AM

useguzzleforrobustttprequestswithheadersandtimeouts.2.parsehtmleffitywithsymfonydomddomedrawlerusingssseLectors.3.handlejavascript-heavysitesbyintegratingpuppeteerviaphpexec()torenderpages.4.respectrobots.txt、rotedelays.txt、adddelays.txt、adddelays.txt、

PHP 8の「マッチ」表現:「if-elseif`チェーンの優れた代替 PHP 8の「マッチ」表現:「if-elseif`チェーンの優れた代替 Aug 02, 2025 pm 02:47 PM

一致式は、PHP8でより簡潔で安全な代替品を提供します。 IF-ELSEIFおよびスイッチと比較して、緩いタイプの比較の誤差を回避するために、厳密な比較(===)を自動的に実行します。 2。一致は、値を直接返すことができる式で、割り当てと関数のリターンに適しているため、コードの単純さを改善します。 3。一致は常に厳密なタイプチェックを使用して、整数、ブール膜、弦の間の予期しない一致を防止します。 4.単一腕のマルチ値マッチング(0、false、 ''など)をサポートしますが、複雑な条件(範囲判断など)は依然としてif-elseifを必要とします。したがって、単一の変数の正確な値をマッピングするときに一致を使用する必要がありますが、複雑なロジックはif-elseifを保持します。

コンテキストマジック定数でエラーロギング戦略を強化します コンテキストマジック定数でエラーロギング戦略を強化します Aug 01, 2025 am 07:47 AM

ContextualMagicConstantantantandAmed、意味のある条件のreavideclecontextinerrorlogs、suthasuser_login_attemptorpayment_processing.2.theyimprovedebuggingbyReplacingvagueErrormessesedexextext、evabling -cuseidextific

Ajax提出チュートリアル付きWordPressカスタム記事タイプボタンポップアップフォーム Ajax提出チュートリアル付きWordPressカスタム記事タイプボタンポップアップフォーム Aug 08, 2025 pm 11:09 PM

このチュートリアルでは、カスタム記事タイプリストのWordPressの各記事に「引用符を送信」ボタンを追加する方法に関する詳細な手順を提供します。クリックした後、記事IDを含むカスタムHTMLフォームがポップアップし、フォームデータはAJAXの提出と成功メッセージ表示です。コンテンツは、フロントエンドのjQuery UIポップアップ設定、動的データ転送、AJAX要求処理、バックエンドのWordPress Ajaxフックとデータ処理PHP実装をカバーし、完全な機能、安全で優れたユーザーエクスペリエンスを確保します。

パフォーマンスの開梱:PHPスイッチとIF-ELSEに関する真実 パフォーマンスの開梱:PHPスイッチとIF-ELSEに関する真実 Aug 02, 2025 pm 04:34 PM

switchcanbeslyfasterthanif-elsewhencomparingsing liabariableagain stiplescalalarues、特にマネイセイセセソールティグアーズデュートープロシブルオプティイゼーション;

PHPの配列の操作方法 PHPの配列の操作方法 Aug 20, 2025 pm 07:01 PM

phparrayshanddedatacollectionseffictifictlyusingindexorassociativeStructures; they recreated witharray()または[]、AccessedViakeys、ModifiedByAssignment、Iterated with foreach、およびmanipulatedUsingfunctionslikecount()、in_array()、Array_key_exists()、Array_exists()、Array_exists()、Array_key_exists()、Array_key_exists()、Array_key_exists()、

See all articles