PHP DOM:XPathを使用します

尊渡假赌尊渡假赌尊渡假赌
リリース: 2025-02-26 09:07:16
オリジナル
519 人が閲覧しました

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート