2009-01-08 12 views
5

Mam dokument szablonu XML, który muszę załadować do XmlDocument. np.XmlDocument i powolne przetwarzanie schematu

myXMLDocument.Load(myXMLFile); 

Jest to jednak bardzo powolne, ponieważ ładuje się w dtd. Próbowałem zarówno "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" i lokalnej kopii dtd. Obie biorą mniej więcej w tym samym czasie. Jeśli włączę ładowanie pliku dtd, ustawiając przelicznik na wartość null (na przykład), wówczas pojawią się błędy, takie jak "Reference to undeclared entity 'nbsp'", jeśli dokument je zawiera.

Potrzebuję użyć XmlDocument, jak potrzebuję manipulować DOM przed wyjściem dokumentu. Jak mogę obejść te problemy?

Odpowiedz

2

Można uniknąć DTD jeśli zwróci pusty strumień pamięci:

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(); 
    } 
} 
+0

To nie wydaje się rozwiązaniem dla mnie : jeśli XML zawiera elementy zdefiniowane w referencyjnym DTD, to nie będzie parsować – MiMo

0

Sprawdź plik DTD, istnieje kilka odniesień do plików .mod w Internecie, być może spowalnia to proces. Możesz także spróbować skomentować niektóre z nich, niektóre z nich, ale nie wszystkie są oznaczone jako "wymagane" w komentarzach.

+0

usunąłem wszystkie te jednak wymagane, jednak nie znacznie przyspieszyć go .. :( – Sprintstar

-1

Czy próbowałeś utworzyć sztuczny program tłumaczący, który zwraca wartość null dla dowolnej ścieżki dtd i przekazuje ją do komendy ładowania? Coś takiego:

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"); 
+1

Próbowałem tylko to, ale spowodowało, że xmlDocument.Load rzucił "Odwołanie do obiektu nie było ustawione na wystąpienie wyjątku obiektu" :( – Sprintstar

0

Jest powolny, ponieważ jest pobierany z sieci. Aby to naprawić, należy wykonać następujące czynności:

  • Pobierz * .mod i pliki * .ent odwołuje DTD (instancja XmlResolver powie nazw URI, które są poszukiwane)
  • Dodaj te pliki do projektu jako pliki zasobów
  • Definiowanie podklasę XmlResolver, którego GetEntity() metoda zwraca strumień utworzony z pliku zasobów lokalnych
3

odpowiedź ChrisW brzmi ciekawe, jednak ja wdrożył resolverowi buforowania z tego link: http://msdn.microsoft.com/en-us/library/bb669135.aspx

To zwiększyło prędkość z około 11,5 s do 160 ms, co prawdopodobnie jest na razie wystarczające. Jeśli nadal nie będzie wystarczająco szybki, wprowadzę rozwiązanie ChrisW. :)

+0

Dzięki za opublikowanie tego: – ChrisW

+0

+1, zadziałało dla mnie – MiMo

Powiązane problemy