2010-02-05 4 views
2

LINQ XElement로로드 된 XHTML 파일을 가져 오려고합니다. 그러나 나는 결의안에 문제가있다. 문제는 다음과 같은 정의과 관련이있다 :커스텀 XmlUrlResolver를 사용하여 XElement에 XHTML 파일을로드하는 방법은 무엇입니까?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

내가 같은 로컬 리소스 스트림에 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd로 링크를 변환하는 오버라이드 (override) GetEntity와 사용자 지정 XmlUrlResolver 있습니다. 이것은 거의 모든 XHTML DTD에서 잘 작동합니다. 내가 실제로 해결할 수없는 유일한 것은 Uri "- // W3C // DTD XHTML 1.0 Transitional // EN"이며, 내가 무엇을해야하는지 확신 할 수 없다. 위의 코드에서 보듯이

public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) 
    { 
     var resourceName = "ePub.DTD." + absoluteUri.Segments[absoluteUri.Segments.GetLength(0) - 1]; 
     if (_resources.Contains(resourceName)) 
     { 
      Stream dataStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); 
      return dataStream; 
     } 
     return base.GetEntity(absoluteUri, role, ofObjectToReturn); 
    } 

, 내가 해결할 수있는 일이 기본 XmlUrlResolver에 의해 처리됩니다. 위의 링크는 - // W3C /로 시작합니다. 그러나 기본 메소드는 DirectoryNotFoundException을 던집니다. 계속하면 XElement이 정상적으로로드됩니다. 대신 빈 스트림을 반환하면 XElement에 XHTML을로드하는 동안 오류가 발생합니다.

사용자 정의 XmlUrlResolver과 같은 공개 정의를 처리 할 수있는 단서가 있습니까? 어딘가 마이크로 소프트 보드에서 도난

답변

3

답변 :

이것은 의도적으로 설계된 동작입니다. 공용 ID와 시스템 ID가 모두 DOCTYPE 선언에 지정된 경우 XmlReader는 먼저 XmlResolver.GetEntity가 공용 식별자 ("- // W3C // DTD XHTML 1.1 // EN")를 인식하는지 확인합니다. 따라서 공용 ID를 사용하여 GetEntity를 호출하고 해결자가 (XmlUrlResolver와 같이) 이해하지 못하면 예외를 throw합니다. XmlReader에서이 예외를 catch하고 GetEntity를 호출하지만 시스템 식별자 ("http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd").이 시간

감사합니다, -Helena Kotas,에서 System.Xml 개발자

Gepost 문 마이크로 소프트의 영업 이익 10-5- 2006 om 17:34

+0

또는 공용 ID를 보이는 시스템 ID로 확인할 수도 있습니다.로드 또는 해결 중에 예외가 발생하지 않으면 올바르게 작동합니다. – Jaapjan

관련 문제