2010-02-15 2 views
0

를 통해 닷넷의 공공 외부 DTD를 처리 지정된 URL을 통해 DTD를 사용할 수 없지만이를 디스크에 다운로드 할 수 있습니다. DTD를로드하기 위해 사용자 지정 XmlResolver를 구현하려고했지만 작동하지 않습니다. GetEntity를 구현하고 디버거를 통해 나는 다음과 같은 호출에오고 볼 수 XmlResolver에 내 사용자 정의 :내 XML이 같은 DTD를 참조하는 XmlResolver를

  1. 요청 된 URI를로드 할 XML 문서입니다. 이 문서의 스트림을 열고 반환합니다. 그건 잘 작동합니다.
  2. DTD는 "file : ///absolut/path/to.xml/-//OWNER//NAME//EN"형식의 URI로 요청됩니다. 정규식을 사용하여 - //. *? //를 확인하고 있지만 제대로 작동하지는 않습니다. 그러나 DTD가 자체 포함되면 작동합니다.
  3. DTD가 modules.ent를 참조하고 있습니다. 결과적으로 URI는 "file : ///absolut/path/to.xml/-//OWNER//NAME//modules.ent"인 GetEntity를 호출합니다. 분명히 이제는 경로의 의도를 재구성하는 것이 아주 이상합니다.

올바른 방법으로 구현하는 방법에 대한 힌트가 있습니까? 공공 부문의 DTD는 출판 분야에서 매우 일반적이므로 깨끗한 솔루션이 있어야한다고 생각합니다.

환호 아힘

답변

1

"file:///absolut/path/to.xml/-//OWNER//NAME//EN" 시스템 및 PUBLIC 식별자들의 연결이다. 일반적으로, 당신은 하나 또는 다른 것을보고 싶어합니다. 둘 다가 아니라 하나의 문자열로보기를 원하지 않습니다. "DTD가 형식의 URI로 요청되었습니다."라고 말하면 누가 요청을하고 있는지 분명하지 않습니다. 호출 코드가 SYSTEM과 PUBLIC을 연결하는 것으로 보입니다.

디스크 파일로 DTD가 있고 하나의 URI를 다른 URI로 매핑해야한다면 GetEntity() 대신 ResolveUri()을 무시할 수 있습니다. GetEntity()은 직접적인 URI처럼 액세스 할 수없는 리소스가있는 경우에 더 유용합니다 (예 : 당신은 런타임에 리소스의 내용을 계산하고, 데이터베이스에서 가져오고, svn : 등등과 같은 비표준 URL 체계와 프로토콜을 사용합니다.

관련 문제