XmlDocumentと遅いスキーマ処理
-
05-07-2019 - |
質問
XmlDocumentに読み込む必要があるxmlテンプレートドキュメントがあります。例
myXMLDocument.Load(myXMLFile);
ただし、これはdtdにロードされるため非常に低速です。 " http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
とdtdのローカルコピーの両方を試しました。どちらも多かれ少なかれ同じ時間がかかります。リゾルバーをnullに設定してdtdの読み込みをオフにすると(たとえば)、ドキュメントにこれらが含まれている場合、"未宣言のエンティティ 'nbsp'"
への参照などのエラーが表示されます。
ドキュメントを出力する前にDOMを操作する必要があるため、XmlDocumentを使用する必要があります。これらの問題を回避するにはどうすればよいですか?
解決
空のメモリストリームを返す場合、DTDを回避できます。
private class DummyResolver : XmlResolver
{
public override System.Net.ICredentials Credentials
{
set
{
// Do nothing.
}
}
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
return new System.IO.MemoryStream();
}
}
他のヒント
ChrisWの答えはおもしろそうですが、次のリンクからキャッシュリゾルバを実装しました: http://msdn.microsoft.com/en-us/library/bb669135.aspx
これにより、速度が約11.5秒から160ミリ秒に増加しました。おそらくこれで十分です。それでも十分に速くない場合、ChrisWのソリューションをほのめかします。 :)
DTDファイルを見てください。一部をコメントアウトしてみることもできますが、一部は「必須」とマークされているわけではありません。コメントで。
ネットワークからダウンロードされているため、遅いです。これを修正するには、次の手順を実行します。
- DTDによって参照される* .modおよび* .entファイルをダウンロードします(XmlResolverインスタンスは、検索されているURIの名前を通知します)
- これらのファイルをリソースファイルとしてプロジェクトに追加します
- ローカルリソースファイルから作成されたストリームをGetEntity()メソッドが返すXmlResolverのサブクラスを定義します
dtdパスに対してnullを返すダミーリゾルバを作成し、それをloadコマンドに渡そうとしましたか?次のようなもの:
class DummyResolver : XmlUrlResolver
{
public override Uri ResolveUri (Uri baseUri, String relativeUri)
{
return null;
}
}
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.XmlResolver = new DummyResolver();
xmlDocument.Load(@"whatever.xml");