Dynamisches Verzeichnis für DTD in einem XML...

15/04/2009 - 09:15 von Andy | Report spam
Hallo NG
Ich habe ein XML welches ein Doctype (DTD) enthalten kann.

Ich möchte gerne dieses Xml via DTD prüfen. Wobei das DTD an einem
bestimmten Ort ist welcher sich àndert, also dynamisch ist.

Wenn kein DTD vorhanden ist muss dieses hinzugefügt werden oder auch ein
bestehendes entfernt oder deaktiviert werden.

Das einlesen funktioniert soweit, doch habe ich das Problem den Pfad des
DTDs zu setzen. Wenn ich die SystemID mit dem Pfad des neuen DTD sezte
bekomme ich einen Fehler "kein DTD gefunden"
resp. wenn bereits ein Doctype definiert ist, "es können nicht zwei DTD
definiert
werden".

1. Wie kann ich also ein bestehende DTD definition entfernen?
2. Wie kann ich eine DTD definition hinzufügen/umdefinieren?

Vorgabe: Dieser Vorhang kann nur im XmlReader vorgenommen werden, es kann
kein XML veràdert werden oder in den Speicher gelesen werden.

Kann mir jemand helfen?
Gibt es irgendwo so ein Beispiel?


























































































































// Create Resolver
XmlResolver Xresolver = null;
Xresolver = new XmlUrlResolver();
Xresolver.Credentials = System.Net.CredentialCache.DefaultCredentials;

// Create Settings
XmlReaderSettings Xsettings = new XmlReaderSettings();
Xsettings.IgnoreComments = true;
Xsettings.IgnoreWhitespace = true;
Xsettings.IgnoreProcessingInstructions = true;
Xsettings.ValidationType = ValidationType.None;
Xsettings.CheckCharacters = true;
Xsettings.ConformanceLevel = ConformanceLevel.Auto;
Xsettings.ProhibitDtd = true;
Xsettings.ValidationType = ValidationType.None;
Xsettings.XmlResolver = Xresolver;
Xsettings.ValidationEventHandler += new
ValidationEventHandler(zValidationCallBack);

//Create Context
NameTable nt = new NameTable(); // Create the NameTable.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
// Create the XmlNamespaceManager.
XmlParserContext Xcontext = new XmlParserContext(null, nsmgr, null,
XmlSpace.None);

// Check if DTD needed
if (mCfgImp.strDtdFile != "" && mCfgImp.strXsdFile == "")
{
Xsettings.ProhibitDtd = false;
Xsettings.ValidationType = ValidationType.DTD;
Xsettings.ValidationFlags =
XmlSchemaValidationFlags.ReportValidationWarnings;
Xcontext.DocTypeName = "root";
//Xcontext.PublicId = "-//W3C//DTD XML 1.0 Strict//EN";
//Xcontext.SystemId = mCfgImp.strDtdFile;
Xcontext.SystemId = Xresolver.ResolveUri(null,
mCfgImp.strDtdFile).ToString();
}

// Create new XML reader
mXrd = XmlReader.Create(strTempXml, Xsettings, Xcontext);


<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


Gruss
Andy
 

Lesen sie die antworten

#1 Christoph Schneegans
15/04/2009 - 10:02 | Warnen spam
"Andy" schrieb:

Ich möchte gerne dieses Xml via DTD prüfen. Wobei das DTD an
einem bestimmten Ort ist welcher sich àndert, also dynamisch ist.

Wenn kein DTD vorhanden ist muss dieses hinzugefügt werden oder
auch ein bestehendes entfernt oder deaktiviert werden.



Erstell dir eine Ableitung von XmlUrlResolver und überschreib die
GetEntity-Methode so, daß sie stets die gewünschte DTD zurückgibt.
MemoryStream-Instanzen sind dafür geeignet.

<http://schneegans.de/sv/> · Schema-Validator für XML

Ähnliche fragen