Benutzer mit den meisten Antworten
Eine xml-Datei mit einemr externen dtd Datei validieren?

Frage
-
Hallo,
ich stehe vor dem Problem eine xml-Datei mit einer externen dtd file zu überprüfen.
Ich finde leider kein anderes Beispiel als dieses und das bezieht sich auf einem xml file indem die dtd Daten vorhanden sind.private static bool isValid = true;
XmlTextReader r = new XmlTextReader("C:\MyFolder\ProductWithDTD.xml");
XmlValidatingReader v = new XmlValidatingReader(r);
v.ValidationType = ValidationType.DTD;
v.ValidationEventHandler += new ValidationEventHandler(MyValidationEventHandler);
while (v.Read())
{
t.
}
v.Close();
if (isValid)
Console.WriteLine("Document is valid");
else
Console.WriteLine("Document is invalid");
public static void MyValidationEventHandler(object sender,
ValidationEventArgs args)
{
isValid = false;
Console.WriteLine("Validation event\n" + args.Message);
}
Was muss ich machen um hier eine externe dtd Datei zu benennen?
Danke für jeden Hinweis und Tipp
Grüße Ingo
Antworten
-
Dein Link zeigt folgendes Beispiel:
Das XML-Dokument sollte die DTD-Datei per <!DOCTYPE root SYSTEM "file:///C:/user/Ingo/Documents/Test.dtd"> referenzieren. So sie das nicht tut, schau dir XmlParserContext an, da kann man die SystemId setzen und einen XmlParserContext an XmlReader.Create übergeben.// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.DTD;
settings.ValidationEventHandler += new ValidationEventHandler (ValidationCallBack);
Jetzt weiß ich leider immer noch nicht, wie ich in den settings den FielName der dtd Datei zuordnen kann.
C:\user\Ingo\Documents\Test.dtd
MVP Data Platform Development My blog- Als Antwort markiert IngoManthey Donnerstag, 26. Januar 2012 04:21
Alle Antworten
-
Hallo Ingo,
Diesen Code hast Du wahrscheinlich von hier. Das ist ein etwas älteres Beispiel. In der Dokumentation zu XmlTextReader steht:
"Da der XmlTextReader die zur Datenvalidierung zusätzlich erforderlichen Prüfungen nicht ausführt, stellt er einen schnellen Parser für Wohlgeformtheit bereit. Verwenden Sie einen XmlReader, um die Datenvalidierung auszuführen. Weitere Informationen finden Sie unter Validieren von XML-Daten mit "XmlReader"."Ein Beispiel findest Du hier: Validierung mithilfe einer DTD mit "XmlReader"
http://msdn.microsoft.com/de-de/library/z2adhb2f.aspxÜbrigens: Hast Du dein älteres Problem schon gelöst?
Gruß
Marcel -
In Normalfall referenziert das XML-Dokument per DOCTYPE-Knoten die externe DTD, also mittels
<!DOCTYPE root SYSTEM "http://example.com/file.dtd">
Dann reicht der Code wie unter http://msdn.microsoft.com/en-us/library/z2adhb2f.aspx#Y220 dokumentiert, dein Beispiel hingegen ist veraltet und nur für .NET 1.x relevant.
Wird die DTD-Datei nicht referenziert, so kann man per XmlParserContext.SystemId die Datei auch bei der Erstellung des XmlReaders per XmlReader.Create mitliefern.
MVP Data Platform Development My blog -
Hallo Marcel,
zuerst einmal schönen Dank für Deine Hilfe. Leider verstehe ich es nicht!! Dein Link zeigt folgendes Beispiel:
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.DTD;
settings.ValidationEventHandler += new ValidationEventHandler (ValidationCallBack);
Jetzt weiß ich leider immer noch nicht, wie ich in den settings den FielName der dtd Datei zuordnen kann.
C:\user\Ingo\Documents\Test.dtd
Grüße Ingo -
Dein Link zeigt folgendes Beispiel:
Das XML-Dokument sollte die DTD-Datei per <!DOCTYPE root SYSTEM "file:///C:/user/Ingo/Documents/Test.dtd"> referenzieren. So sie das nicht tut, schau dir XmlParserContext an, da kann man die SystemId setzen und einen XmlParserContext an XmlReader.Create übergeben.// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.DTD;
settings.ValidationEventHandler += new ValidationEventHandler (ValidationCallBack);
Jetzt weiß ich leider immer noch nicht, wie ich in den settings den FielName der dtd Datei zuordnen kann.
C:\user\Ingo\Documents\Test.dtd
MVP Data Platform Development My blog- Als Antwort markiert IngoManthey Donnerstag, 26. Januar 2012 04:21
-
Hallo Ingo,
Nimm dir bitte die Zeit, die Dokumentation zu lesen. Wenn Du meinst, dass es mit praktischen Anleitungen schneller geht, guck dir auch diese Antwort von Martin an:
Need to validate XML file against external DTD:
http://social.msdn.microsoft.com/Forums/en-US/xmlandnetfx/thread/ccf035ac-3bfa-48b0-82b7-04aae017bd91#c403dd6f-4ddf-48ab-acbe-3ebfdb3384dc
Gruß
Marcel -
Hallo Marin,
zuerst DIr natürlich auch vielen Dank vor Deinen Tipp.
Ich habe folgendes probiert:
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.DTD;
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.NameTable = new NameTable();
XmlParserContext context = new XmlParserContext(settings.NameTable, new XmlNamespaceManager(settings.NameTable), "root-element-name", "", "file:///C:/Users/Ingo/Documents/Visual Studio 2010/Data/gdpdu-01-08-2002.dtd", "", "", "en", XmlSpace.Default);using (XmlReader reader = XmlReader.Create(Path.Combine(exportPath, "index.xml"), settings, context))
{
try
{
while (reader.Read()) { }
}
catch (XmlException e)
{
MaStdMessages.ShowException(e);
}
}Ich bekomme dann eine Exception keine DTD gefunden. DIe liegt aber 100% ig im dem angegeben Verzeichnis. Was mache ich noch falsch?
Grüße Ingo