문제

XMLDocument에로드 해야하는 XML 템플릿 문서가 있습니다. 예를 들어

myXMLDocument.Load(myXMLFile);

그러나 이것은 DTD에로드되므로 매우 느립니다. 나는 둘 다 시도했다 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" 및 DTD의 현지 사본. 둘 다 거의 동시에 걸립니다. Resolver를 NULL로 설정하여 DTD를로드하면 (예 :) 다음과 같은 오류가 발생합니다. "Reference to undeclared entity '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 대에서 160ms로 증가했으며 현재는 충분할 것입니다. 여전히 충분히 빠르지 않으면 Chrisw의 솔루션을 구현할 것입니다. :)

DTD 파일을 보면 .MOD 파일에 대한 온라인 참조가 더 있습니다. 아마도 프로세스가 느려질 것입니다. 당신은 또한 그들 중 일부를 언급하려고 시도 할 수 있습니다. 일부는 그 중 일부가 주석에서 "필수"로 표시되어있는 것은 아닙니다.

네트워크에서 다운로드되기 때문에 느립니다. 이 문제를 해결하려면 다음을 수행하십시오.

  • DTD가 참조하는 *.mod 및 *.ent 파일을 다운로드합니다 (XMLRESOLVER 인스턴스는 찾은 URI의 이름을 알려줍니다).
  • 이 파일을 프로젝트에 리소스 파일로 추가하십시오
  • getEntity () 메서드가 로컬 리소스 파일에서 생성 된 스트림을 반환하는 XMLRESOLVER의 서브 클래스 정의

DTD 경로에 대해 NULL을 반환하고이를로드 명령에 전달하는 더미 리졸버를 작성해 보셨습니까? 같은 것 :

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