Frage

In einem ich mit etwas Arbeit erwähnt ein 3rd-Party-DLL, deren Schnittstelle verwendet eine Reihe von XML-Eingängen, die DTDs definiert verwenden. Alles hat reibungslos so weit gegangen, aber ich habe immer noch dieses quälende Problem mit der Lösung des Document Type Declaration in den generierten Eingangswerte.

Was kann ich nicht herausfinden, was der entscheidende Faktor bei der Bestimmung, wo für die referenzierte DTD-Datei zu suchen. Wenn ich eine Erklärung, die wie folgt aussieht:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

Meine erste Überlegung war, dass die aktuelle Ausführungspfad der Anwendung ist, wo ein Parser für die DTD aussehen würde. Allerdings, wenn ich versuche, eine XML Steuerung rel="nofollow in ASP.Net, die Fehler, die ich verwirrt mich bekommen ...

  

Datei konnte nicht ‚c: \ Programme \ Microsoft Visual   Studio   9.0 \ Common7 \ IDE \ ElementName.dtd '

Warum ist es für die DTD suchen?

Gibt es irgendwelche XML-Gurus da draußen, die mich auf diesem helfen kann. Ich wirklich haben keine Kontrolle über die XML, die von dieser DLL zurückgegeben wird, so was soll ich tun soll. Gibt es eine Möglichkeit, eine DTD mit dem Betriebssystem auf „registrieren“? Wie das GAC?

War es hilfreich?

Lösung

Leider ist die Bibliothek, die die XML generiert verwendet, um eine relative URL für die dtd eher als ein voll qualifizierten ein. Als solche ist die XmlDocument des XmlControl wird unter Verwendung eines XmlResolver Klasse den relativen Pfad zu einem vollständig qualifizierten umzuwandeln. Standardmäßig verwendet es einen XmlUrlResolver (dh ein Beton XmlResolver). Dies wird versuchen, die Lage des dtd an einen Ort wo es sich denkt, ist in Bezug auf das XML-Dokument. Das Problem ist nur, wo ist der XmlDocument? Wahrscheinlich in Erinnerung, die nicht im Verhältnis zu irgendetwas ist und die XmlUrlResolver wird mit dem Prozess Standort statt, die in Ihrem Fall ist Visual Studio, die befindet sich unter ‚c: \ Programme \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ devenv.exe‘.

Also, was können Sie tun? Nun, ich nehme an, Sie müssen Kiste besitzen Sie XmlResolver, die von XmlUrlResolver erbt ein überschreibt die ResolveUri Methode und tut etwas angemessen. Nachdem dies erledigt, den Sie haben:

  1. Erstellen Sie eine XmlReaderSettings Klasse und stellen Sie die XmlReolver Eigenschaft auf die Klasse, die Sie gerade erstellt haben.
  2. Erstellen Sie eine XmlReader XmlReader.Create () in Ihrem Dokument vorbei und die XmlSettings Objekt.
  3. ein XmlDocument erstellen und Lastgang im XmlReader nennen und schließlich.
  4. Stellen Sie die XmlDocument Eigentum Ihrer XmlControl zum XmlDocument.

Ehrlich gesagt, das ist alles ein bisschen nervig, also wenn es wo ich werde ich nur String.Replace verwenden, um die DTD-Deklaration aus dem Dokument zu entfernen, bevor es in der XML-Verarbeitung.

Wenn Sie wirklich mutig sind Sie einen Resolver erstellen können, die direkt von XmlResolver erbt. Sobald Sie das getan haben Sie die GetEntity Methode und dann können Sie das dtd Dokument erhalten, wo immer Sie möchten. Ich schrieb man einmal die DTDs von Dateien eingebettet als Ressource-Dateien bekommen, aber leider habe ich den Code nicht habe mehr: - (

Andere Tipps

Wenn Sie nicht kümmern eigentlich über jedes einzelnes Dokument gegen seine DTD Validieren Sie die XmlResolver Eigenschaft auf null auf XmlTextReader (oder XmlDocument) einstellen könnten die DTD ganz zu ignorieren.

scroll top