5

XmlDocument にロードする必要がある xml テンプレート ドキュメントがあります。例えば

myXMLDocument.Load(myXMLFile);

ただし、これは dtd にロードされるため、非常に低速です。両方"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"と dtd のローカル コピーを試しました。どちらもほぼ同じ時間がかかります。(たとえば) リゾルバーを null に設定して dtd の読み込みを無効にすると"Reference to undeclared entity 'nbsp'"、ドキュメントにこれらが含まれている場合などのエラーが発生します。

ドキュメントを出力する前に DOM を操作する必要があるため、XmlDocument を使用する必要があります。これらの問題を回避するにはどうすればよいですか?

4

5 に答える 5

3

ChrisW の回答は興味深いようですが、次のリンクからキャッシュ リゾルバーを実装しました: http://msdn.microsoft.com/en-us/library/bb669135.aspx

これにより速度が約 11.5 秒から 160 ミリ秒に向上しましたが、これでおそらく十分です。それでも十分に速くない場合は、ChrisW のソリューションを実装します。:)

于 2009-01-08T13:18:19.220 に答える
2

空のメモリ ストリームを返すと、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();
   }
}
于 2011-05-13T13:06:56.973 に答える
0

ネットワークからダウンロードされているため、低速です。これを修正するには、次の手順を実行します。

  • DTDによって参照される*.modおよび*.entファイルをダウンロードします(XmlResolverインスタンスは検索されているURIの名前を教えてくれます)
  • これらのファイルをリソースファイルとしてプロジェクトに追加します
  • XmlResolverのサブクラスを定義します。このサブクラスのGetEntity()メソッドは、ローカルリソースファイルから作成されたストリームを返します。
于 2009-01-08T11:33:52.223 に答える
0

DTD ファイルを見てください。.mod ファイルへのオンライン参照が他にもいくつかあります。おそらくこれらはプロセスを遅くします。それらのいくつかをコメントアウトすることもできますが、コメントで「必須」とマークされているわけではありません。

于 2009-01-08T11:20:57.350 に答える
-1

任意の 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");
于 2009-01-08T11:22:36.893 に答える