同じ単一の XML スキーマ (XSD) に対して XML ファイルのバッチを検証するプロセスを高速化したいと考えています。唯一の制限は、私が PHP 環境にいるということです。
現在の問題は、検証したいスキーマに 2755 行のかなり複雑な xhtml スキーマが含まれていることです (http://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsd)。非常に単純なデータであっても、これには長い時間がかかります (検証前に約 30 秒)。私のバッチには何千もの XML ファイルがあるので、これは実際にはうまくスケーリングできません。
XML ファイルの検証には、標準の php-xml ライブラリからこれらの両方の方法を使用します。
- DOMDocument::schemaValidate
- DOMDocument::schemaValidateSource
PHP 実装は HTTP 経由で XHTML スキーマをフェッチし、内部表現 (おそらく DOMDocument) を構築し、検証が完了すると破棄されると考えています。私は、XML-libs のいくつかのオプションがこの動作を変更して、再利用のためにこのプロセスで何かをキャッシュする可能性があると考えていました。
私の問題を説明する簡単なテスト設定を作成しました。
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
targetNamespace="http://myschema.example.com/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:myschema="http://myschema.example.com/"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xs:import
schemaLocation="http://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsd"
namespace="http://www.w3.org/1999/xhtml">
</xs:import>
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="MyHTMLElement">
<xs:complexType>
<xs:complexContent>
<xs:extension base="xhtml:Flow"></xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://myschema.example.com/" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://myschema.example.com/ test-schema.xsd ">
<MyHTMLElement>
<xhtml:p>This is an XHTML paragraph!</xhtml:p>
</MyHTMLElement>
</Root>
<?php
$data_dom = new DOMDocument();
$data_dom->load('test-data.xml');
// Multiple validations using the schemaValidate method.
for ($attempt = 1; $attempt <= 3; $attempt++) {
$start = time();
echo "schemaValidate: Attempt #$attempt returns ";
if (!$data_dom->schemaValidate('test-schema.xsd')) {
echo "Invalid!";
} else {
echo "Valid!";
}
$end = time();
echo " in " . ($end-$start) . " seconds.\n";
}
// Loading schema into a string.
$schema_source = file_get_contents('test-schema.xsd');
// Multiple validations using the schemaValidate method.
for ($attempt = 1; $attempt <= 3; $attempt++) {
$start = time();
echo "schemaValidateSource: Attempt #$attempt returns ";
if (!$data_dom->schemaValidateSource($schema_source)) {
echo "Invalid!";
} else {
echo "Valid!";
}
$end = time();
echo " in " . ($end-$start) . " seconds.\n";
}
この schematest.php ファイルを実行すると、次の出力が生成されます。
schemaValidate: Attempt #1 returns Valid! in 30 seconds.
schemaValidate: Attempt #2 returns Valid! in 30 seconds.
schemaValidate: Attempt #3 returns Valid! in 30 seconds.
schemaValidateSource: Attempt #1 returns Valid! in 32 seconds.
schemaValidateSource: Attempt #2 returns Valid! in 30 seconds.
schemaValidateSource: Attempt #3 returns Valid! in 30 seconds.
この問題を解決する方法に関するヘルプや提案は大歓迎です!