문제

안에 이전 질문 저는 인터페이스가 DTD를 사용하여 정의된 일련의 XML 입력을 사용하는 타사 DLL에 대한 일부 작업을 언급했습니다.지금까지는 모든 것이 순조롭게 진행되었지만 생성된 입력 값의 문서 유형 선언을 해결하는 데 여전히 골치 아픈 문제가 있습니다.

내가 알 수 없는 것은 참조된 DTD 파일을 찾을 위치를 결정할 때 결정 요인이 무엇인지입니다.다음과 같은 선언이 있는 경우:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

나의 초기 생각은 애플리케이션의 현재 실행 경로가 파서가 DTD를 찾는 곳이라는 것이었습니다.그러나 XML 컨트롤 ASP.Net에서 오류가 발생하여 당황스럽습니다...

'c:\Program Files\Microsoft Visual 파일을 찾을 수 없습니다. 스튜디오 9.0\Common7\IDE\ElementName.dtd'

왜 거기에서 DTD를 찾고 있습니까?

이 문제에 대해 도움을 줄 수 있는 XML 전문가가 있습니까?저는 실제로 이 DLL에서 반환된 XML을 제어할 수 없으므로 어떻게 해야 합니까?운영 체제에 DTD를 "등록"하는 방법이 있습니까?GAC처럼요?

도움이 되었습니까?

해결책

불행하게도 XML을 생성한 라이브러리는 정규화된 URL이 아닌 dtd에 대한 상대 URL을 사용했습니다.따라서 XmlControl의 XmlDocument는 XmlResolver 상대 경로를 정규화된 경로로 변환하는 클래스입니다.기본적으로 XmlUrlResolver (즉, 구체적인 XmlResolver입니다).이는 dtd의 위치를 ​​Xml 문서와 관련된 위치로 매핑하려고 시도합니다.문제는 XmlDocument가 어디에 있습니까?아마도 어떤 것과도 관련되지 않은 메모리에 있고 XmlUrlResolver는 대신 'c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe'에 있는 Visual Studio인 프로세스 위치를 사용하고 있을 것입니다.

그럼 당신은 무엇을 할 수 있나요?XmlUrlResolver에서 상속하고 ResolveUri 메서드를 재정의하고 적절한 작업을 수행하는 자신만의 XmlResolver를 만들어야 한다고 가정하겠습니다.그렇게 한 후에는 다음을 수행해야 합니다.

  1. XmlReaderSettings 클래스를 만들고 XmlReolver 속성을 방금 만든 클래스로 설정합니다.
  2. 문서와 XmlSettings 개체를 전달하는 XmlReader.Create()를 사용하여 XmlReader를 만듭니다.
  3. XmlDocument를 만들고 XmlReader를 전달하는 Load를 호출한 다음 마지막으로 호출합니다.
  4. XmlControl의 XmlDocument 속성을 XmlDocument로 설정합니다.

솔직히 그것은 약간의 고통이므로 XML로 처리하기 전에 문서에서 DTD 선언을 제거하기 위해 string.Replace를 사용합니다.

정말로 용기가 있다면 XmlResolver에서 직접 상속되는 확인자를 만들 수 있습니다.이 작업을 완료한 후에는 GetEntity 방법을 사용하면 원하는 곳 어디에서나 dtd 문서를 얻을 수 있습니다.리소스 파일로 포함된 파일에서 dtd를 얻는 코드를 한 번 작성했지만 불행히도 더 이상 코드가 없습니다. :-(

다른 팁

실제로 DTD에 대해 각 문서를 검증하는 데 실제로 신경 쓰지 않으면 XMLTEXTREADER (또는 XMLDocument)에서 XMLRESOLVER 속성을 NULL로 설정하여 DTD를 완전히 무시할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top