【PHP8.x】schemaValidateメソッドの使い方

schemaValidateメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

schemaValidateメソッドは、XMLドキュメントが指定されたスキーマ定義に準拠しているかを検証するメソッドです。このメソッドは、PHPのDOMDocumentクラスに属し、主にXMLデータの構造的な整合性をプログラムで確認するために使用されます。例えば、外部システムから受け取ったXMLデータが、あらかじめ決められた形式(XML Schema Definition: XSDなど)に沿っているかをチェックする際に非常に役立ちます。これにより、データの信頼性を向上させ、後続の処理で予期せぬエラーが発生するのを防ぐことができます。

このメソッドは引数として、検証に使用するスキーマファイルへのパス(文字列)を受け取ります。検証が成功し、XMLドキュメントがスキーマに準拠している場合はブール値のtrueを返し、準拠していない場合はfalseを返します。

検証が失敗した場合、PHPは通常警告(Warning)を発生させます。プログラム内で詳細なエラー情報を取得したり、警告の出力を制御したりしたい場合は、libxml_use_internal_errors(true)関数と組み合わせて使用し、libxml_get_errors()関数でエラーメッセージを取得する方法が推奨されます。このメソッドを呼び出す前には、検証対象のXMLドキュメントがDOMDocumentオブジェクトに適切にロードされている必要があります。

構文(syntax)

1<?php
2
3$dom = new DOMDocument();
4$isValid = $dom->schemaValidate('your_schema.xsd');
5
6?>

引数(parameters)

string $filename, int $flags = 0

  • string $filename: 検証に使用するスキーマファイルのパスを指定する文字列
  • int $flags = 0: 検証の挙動を制御するためのフラグを指定する整数

戻り値(return)

bool

指定されたXML文書が、指定されたスキーマに対して有効であるかどうかを真偽値 (true または false) で返します。

サンプルコード

PHP DOMDocument schemaValidateでXMLを検証する

1<?php
2
3/**
4 * XMLがスキーマ定義ファイルに対して有効か検証するサンプル関数
5 *
6 * DOMDocument::schemaValidate() は、XMLドキュメントを指定されたXSDファイルで検証します。
7 * このサンプルでは、一時的にXSDファイルを作成して検証を実行します。
8 */
9function validateXmlAgainstSchemaFile(): void
10{
11    // --- 準備: 検証対象のXMLとスキーマ定義(XSD) ---
12
13    // 1. 検証対象のXMLデータ
14    $xmlString = <<<XML
15<?xml version="1.0" encoding="UTF-8"?>
16<user>
17    <name>Taro Yamada</name>
18    <age>30</age>
19</user>
20XML;
21
22    // 2. 検証に使用するXML Schema (XSD)
23    // user要素には、string型のnameとinteger型のageが必須であると定義
24    $xsdSchema = <<<XSD
25<?xml version="1.0" encoding="UTF-8"?>
26<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
27  <xs:element name="user">
28    <xs:complexType>
29      <xs:sequence>
30        <xs:element name="name" type="xs:string"/>
31        <xs:element name="age" type="xs:integer"/>
32      </xs:sequence>
33    </xs:complexType>
34  </xs:element>
35</xs:schema>
36XSD;
37
38    // --- 実行: スキーマファイルを使った検証 ---
39
40    // スキーマ定義を一時ファイルに保存
41    $schemaFilename = 'user_schema.xsd';
42    file_put_contents($schemaFilename, $xsdSchema);
43
44    // DOMDocumentオブジェクトを作成
45    $doc = new DOMDocument();
46    $doc->loadXML($xmlString);
47
48    // 検証エラーをPHPの警告としてではなく、内部的に取得できるように設定
49    libxml_use_internal_errors(true);
50
51    try {
52        // schemaValidate() メソッドでスキーマファイルを使って検証を実行
53        if ($doc->schemaValidate($schemaFilename)) {
54            echo "XMLドキュメントはスキーマに対して有効です。" . PHP_EOL;
55        } else {
56            echo "XMLドキュメントはスキーマに対して無効です。" . PHP_EOL;
57            // 検証エラーの詳細を取得して表示
58            $errors = libxml_get_errors();
59            foreach ($errors as $error) {
60                // "行番号: エラーメッセージ" の形式で出力
61                echo "  [Line: {$error->line}] {$error->message}";
62            }
63            // 内部エラーバッファをクリア
64            libxml_clear_errors();
65        }
66    } finally {
67        // --- 後処理 ---
68        // 作成した一時ファイルを削除
69        if (file_exists($schemaFilename)) {
70            unlink($schemaFilename);
71        }
72        // libxmlのエラーハンドリング設定をデフォルトに戻す
73        libxml_use_internal_errors(false);
74    }
75}
76
77// 関数を実行
78validateXmlAgainstSchemaFile();
79
80?>

DOMDocument::schemaValidate()メソッドは、XMLドキュメントが指定したXMLスキーマ定義(XSD)ファイルのルールに従っているか検証するための機能です。

このサンプルコードでは、まず検証対象となるユーザー情報のXMLデータと、その構造を定義したXSDスキーマをそれぞれ文字列として準備します。schemaValidate()メソッドはスキーマ定義をファイルから読み込むため、準備したXSD文字列はfile_put_contents()関数を使って一時ファイルとして保存しています。

次に、DOMDocumentオブジェクトを作成してXMLデータを読み込み、schemaValidate()メソッドを実行します。第一引数には、検証ルールが書かれたXSDファイルのパスを指定します。このメソッドは、検証が成功すればtrueを、XMLがスキーマのルールに適合せず失敗した場合はfalseを返します。

また、このコードでは検証エラーの詳細な情報を取得するため、事前にlibxml_use_internal_errors(true)を呼び出しています。これにより、検証が失敗した際にlibxml_get_errors()関数でエラー内容を取得し、どこに問題があったかを確認できます。処理の最後には、作成した一時ファイルを削除し、エラーハンドリング設定を元に戻す後処理を行っています。

DOMDocument::schemaValidateメソッドは、スキーマ定義が書かれたファイルへのパスを引数に指定します。スキーマ定義を文字列で持っている場合は、サンプルのように一度ファイルに保存する必要があります。また、このメソッドは検証に失敗するとfalseを返すだけなので、エラーの具体的な内容を知るためには、事前にlibxml_use_internal_errors(true)を呼び出しておく必要があります。これにより、検証後にlibxml_get_errors関数で詳細なエラー情報を取得できます。処理の最後には、finallyブロック内で一時ファイルの削除と、libxml_use_internal_errors(false)で設定を元に戻す後処理を忘れずに行うことが重要です。これにより、不要なファイルが残ったり、他のXML処理に影響を与えたりすることを防げます。

PHPでXMLをXSDスキーマで検証する

1<?php
2
3/**
4 * XML文字列をXSDスキーマで検証するサンプル関数
5 *
6 * この関数は、XMLとXSDの文字列を受け取り、一時ファイルを作成して
7 * DOMDocument::schemaValidate を使用して検証を実行します。
8 *
9 * @return void
10 */
11function validateXmlWithSchema(): void
12{
13    // 検証対象のXMLデータ
14    $xmlString = <<<XML
15    <?xml version="1.0" encoding="UTF-8"?>
16    <book>
17        <title>PHP実践入門</title>
18        <author>Taro Yamada</author>
19        <price>3000</price>
20    </book>
21    XML;
22
23    // 検証ルールを定義したXSDスキーマデータ
24    $xsdString = <<<XSD
25    <?xml version="1.0" encoding="UTF-8"?>
26    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
27      <xs:element name="book">
28        <xs:complexType>
29          <xs:sequence>
30            <xs:element name="title" type="xs:string"/>
31            <xs:element name="author" type="xs:string"/>
32            <xs:element name="price" type="xs:positiveInteger"/>
33          </xs:sequence>
34        </xs:complexType>
35      </xs:element>
36    </xs:schema>
37    XSD;
38
39    // schemaValidateはファイルパスを要求するため、一時ファイルを作成します
40    $xmlFile = tempnam(sys_get_temp_dir(), 'xml');
41    $xsdFile = tempnam(sys_get_temp_dir(), 'xsd');
42
43    file_put_contents($xmlFile, $xmlString);
44    file_put_contents($xsdFile, $xsdString);
45
46    try {
47        // DOMDocumentオブジェクトを作成
48        $dom = new DOMDocument();
49
50        // XMLファイルを読み込む
51        $dom->load($xmlFile);
52
53        // libxmlのエラーを内部で処理するように設定
54        // これにより、検証エラーが発生しても警告が表示されなくなり、後でエラー内容を取得できます
55        libxml_use_internal_errors(true);
56
57        // XSDファイルを使ってXMLを検証
58        // 戻り値は、検証に成功した場合は true、失敗した場合は false
59        if ($dom->schemaValidate($xsdFile)) {
60            echo "XMLはスキーマに対して有効です。" . PHP_EOL;
61        } else {
62            echo "XMLはスキーマに対して無効です。" . PHP_EOL;
63            echo "--- エラー内容 ---" . PHP_EOL;
64
65            // 検証エラーの詳細を取得して表示
66            $errors = libxml_get_errors();
67            foreach ($errors as $error) {
68                echo "行 {$error->line}: {$error->message}";
69            }
70            libxml_clear_errors(); // エラーバッファをクリア
71        }
72    } finally {
73        // libxmlのエラーハンドリングを元に戻す
74        libxml_use_internal_errors(false);
75
76        // 作成した一時ファイルを削除
77        if (file_exists($xmlFile)) {
78            unlink($xmlFile);
79        }
80        if (file_exists($xsdFile)) {
81            unlink($xsdFile);
82        }
83    }
84}
85
86// 関数を実行
87validateXmlWithSchema();
88

このサンプルコードは、PHPのDOMDocumentクラスを使い、XMLデータが特定のルール(XSDスキーマ)に従っているかを検証する方法を示しています。

中心となるのはDOMDocumentクラスのschemaValidateメソッドです。このメソッドは、引数に指定されたXSDスキーマファイルのパスを使い、DOMDocumentオブジェクトに読み込まれているXMLドキュメントを検証します。検証に成功した場合はtrueを、失敗した場合はfalseを返します。

サンプルコードでは、まず検証したいXMLデータと、その構造を定義するXSDスキーマを文字列として用意します。schemaValidateメソッドはファイルパスを引数に取るため、これらの文字列を一時ファイルとして保存しています。

検証エラーが発生した際にPHPの警告が表示されるのを防ぎ、エラー内容を後から取得できるようにするため、事前にlibxml_use_internal_errors(true)を呼び出しています。検証が失敗した場合、libxml_get_errors関数でエラーの詳細なリストを取得し、どこに問題があったかを表示します。最後に、finallyブロックで作成した一時ファイルを削除し、libxmlのエラー設定を元に戻して処理を終了します。

DOMDocument::schemaValidateメソッドはファイルパスを引数に取るため、文字列データを検証する場合は一時ファイルを作成する必要があります。検証エラーを詳細に取得するには、事前にlibxml_use_internal_errors(true)を呼び出すことが重要です。これにより、エラーがPHPの警告として出力されるのを防ぎ、プログラムで内容を捕捉できます。処理の成功失敗にかかわらず後処理を確実に行うため、finallyブロックで一時ファイルの削除とlibxmlの設定を元に戻しています。この後処理を忘れると、不要なファイルがサーバーに残ったり、他のXML処理に影響を与えたりする可能性があるため注意が必要です。

関連コンテンツ

関連プログラミング言語

【PHP8.x】schemaValidateメソッドの使い方 | いっしー@Webエンジニア