1

xml ファイルを XmlDocument にロードするときに、オーバーロードされた XmlResolver の GetEntity 関数にFormal Public Identifierが渡されるのはなぜですか? これはバグですか、それともどうにか対処する必要がありますか?

編集:ここにいくつかのコードがあります。

たとえば、私はこれを行うとします:

XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.XmlResolver = new MyXmlResolver();
myXmlDoc.Load("myxmlfile.xml");

私はMyXmlResolver次のコードを持っています:

public override object GetEntity(Uri absUri, string role, Type typeToRet)
{
  if (typeToRet == null || typeToRet == typeof(Stream))
     return GetStream(absUri);
  else
     throw new XmlException("Unsupported class type: " + typeToRet);
}

私には意味をなさない" file://path/to/xmldoc/-//W3C//DTD XHTML 1.1//EN"が渡されます。absUri無視するしかないのでしょうか?

4

3 に答える 3

0

本当にカスタムが必要XmlResolverですか?カスタム実装を保証するリゾルバーで何をしていますか?

このようなURIが渡される理由はXmlDocument、ドキュメント内のすべての外部参照(DTDなど)を明示的に解決するように指示したためです。手動で行う必要がない場合は、既存のXmlResolverタイプを使用するか、そのままにnullしてデフォルトの動作を実行する必要があります。

于 2009-01-23T14:30:29.657 に答える
0

dtd、modファイルなどをローカルにキャッシュするために1つ使用しています(この質問を参照)。それが行うことに関する私の問題は、それが私に渡すFPIが実際には外部参照ではなく、実際の外部参照と区別できないことです。

于 2009-01-23T14:34:55.793 に答える
0

私は同じ問題を抱えています。私が行ったことは、渡された値をチェックすることでした。それが悪い値である場合は、作成したダミー DTD の有効な uri を返しました。適切な dtd がドキュメントの横にある場合は、LoadXML を呼び出すだけで機能します。DTD だけを確認し、GetEntity メソッドを爆破している PUBLIC 部分を無視する方法を知っています。DTD をローカルの共通の場所に置きたいので、さまざまな場所でドキュメントと一緒に使う必要はありません。したがって、GetEntity をオーバーライドして共通パスを指定すると、ファイルシステム全体に存在する多くのドキュメントに対して 1 つの DTD を使用できます。

于 2009-10-01T03:53:45.567 に答える