0

次のシナリオで大きなXMLファイルを検証する効率的な方法を探しています。

1)ファイルがネットワークから受信されています。

2)提供されたDTDに基づいてxmlの検証が必要です。

3)ノード情報が構成可能なファイルの特定のノードのデータを処理する他のスレッドが実行されています。

4)検証では、ファイル全体が検証されるのを待つために他のスレッドをブロックしてはなりません。

これは長時間実行されるプロセスであるため、xmlファイルは、不明な中断を挟んで数時間、数日、または数か月間、ポートで継続的に受信されます。

私はそのソリューションが必要です

1)リーダー/バリデーターにファイルの最後まで読み取らせてから、検証結果を送信しないでください。

2)データノードにはすべてのデータが含まれているため、データノードへのバリデーターの開始を停止し、一定量のデータのみの読み取りを開始し、読み取りデータをスタンディングスレッドに送信して非同期で処理し、バリデーターに読み取りと送信を続行させます。

上記のアプローチは正しいですか?そのようなxmlバリデーターは存在しますか?それを作成する方法ではない場合は?クラスでIXmlLineInfo、IXmlNamespaceResolverを継承しようとしましたが、それらを実装するのは大変な作業のようです。

4

2 に答える 2

1

XmlReaderはファイルを解析し、 XmlReaderSettings を使用してインラインで検証できます

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(null, path);
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(ValidationEventHandler);
于 2012-08-02T11:05:29.463 に答える
0

Saxon-EE の検証機能とストリーミング機能 (もちろん C# から呼び出すことができます) を使用してこれを解決できると思いますが、それは難しい要件であり、設計を作成することは典型的な StackOverflow の回答の範囲を超えています:数日間のコンサルティングに投資することを正当化する何か。

ここで実際に考えているのは、DTD 検証ではなく XSD 検証です。DTD から XSD を生成するのは簡単です。

解決策は次のように単純である可能性があります。

<xsl:stylesheet version="3.0" ...>
<xsl:mode streamable="yes"/>

<xsl:template match="record">
  <xsl:try>
    <xsl:result-document href="{@id}.xml" validation="strict">
      <xsl:copy-of select="."/>
    </xsl:result-document>
    <xsl:catch/>
  </xsl:try>
</xsl:template>

</xsl:stylesheet>

これが明らかに満たさない要件の唯一の部分は、すべてが単一のスレッドで実行されることです。Saxon にはマルチスレッド機能がありますが、ストリーミングとうまく組み合わせられません。ただし、要件をより詳細に理解すれば、それに対する解決策が見つかるはずです。

于 2012-08-03T09:02:46.583 に答える