質問

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");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top