Xml validatie in C#

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Voor een applicatie genereren we xliff bestanden. Om zeker te zijn dat de bestanden goed gegenereerd worden, wil ik ze valideren aan de hand van het xliff schema. Dit blijkt echter niet zo eenvoudig!

Mijn eerste poging was redelijk rechttoe rechtaan:

C#:
1
2
3
4
5
6
7
8
9
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += ValidationHandler;
settings.Schemas.Add(null, "http://docs.oasis-open.org/xliff/v1.2/cs02/xliff-core-1.2-strict.xsd");

StringReader sr = new StringReader(doc.OuterXml);
XmlReader reader = XmlReader.Create(sr, settings);

while (reader.Read()) ;


Deze code hangt echter op regel 4, bij het toevoegen van het schema. Na flink wat speurwerk kwam ik erachter dat de oorzaak ligt in het feit dat het schema een ander schema importeert, en wel http://www.w3.org/2001/xml.xsd. Het blijkt dat w3.org de belangstelling voor hun standaard schema nogal overweldigend vond, en een rate throttle erop hebben gezet. Ik heb het vermoeden dat ze dit per domein doen, wat ervoor zorgt dat het bestand voor ons praktisch nooit te downloaden is.

Maar goed, het is toch beter om alles te valideren tegen lokale schema's! Dus ik heb zowel het xliff schema als het xml schema gedownload, en mijn code als volgt aangepast:

C#:
1
2
3
4
5
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += ValidationHandler;
settings.Schemas.Add(null, "xml.xsd");
settings.Schemas.Add(null, "xliff-core-1.2-strict.xsd");


Maar helaas, nu leidt het toevoegen van xml.xsd tot een foutmelding dat het parsen van DTD's uit veiligheidsoverwegingen niet is toegestaan.

Nog meer onderzoek later leidde dit tot de volgende versie:

C#:
1
2
3
4
5
6
7
8
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.DtdProcessing = DtdProcessing.Parse;

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += ValidationHandler;
settings.Schemas.Add(null, XmlReader.Create("xml.xsd", xrs));
settings.Schemas.Add(null, XmlReader.Create("xliff-core-1.2-strict.xsd", xrs));


Hiermee geef ik expliciet aan dat het processen van DTD's best wel okay is. Maar nee, nu hangt het weer op het toevoegen van het xliff schema. Hierin wordt nog steeds verwezen naar http://www.w3.org/2001/xml.xsd, en blijkbaar gaat .Net proberen dat document te benaderen, ook al is er een lokaal schema met passende namespace beschikbaar.

Verwijderen van de schemaLocation lijkt te helpen. De validatie loopt helemaal door. Maar als ik validation warnings ook aan zet, zie ik de melding "Could not find schema information for the element 'xliff'". Een beetje spelen met het xml document leert me dat nu wel wordt gecontroleerd of het document geldig xml is, maar niet of het ook voldoet aan het xliff schema.

Het xml document zelf ziet er ongeveer zo uit:

XML:
1
2
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2"><file /></xliff>


Iemand enig idee hoe ik mijn xml document in C# kan valideren? Hoe moeilijk kan het zijn?

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 15:03

Sebazzz

3dp

Moet je geen xml namespace (xmlns) bij de root node van je document specificeren?

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik zou die xsd even aanpassen zodat niet naar w3c wordt verwezen, als in http://stackoverflow.com/...attribute-is-not-declared

http://londata.svnrepository.com/xmlcatalog.net/trac.cgi/ is ook een mooie trouwens, vraag is enkel of dat nog aan KISS voldoet.

[ Voor 26% gewijzigd door pedorus op 22-02-2012 20:14 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
pedorus schreef op woensdag 22 februari 2012 @ 20:11:
Ik zou die xsd even aanpassen zodat niet naar w3c wordt verwezen, als in http://stackoverflow.com/...attribute-is-not-declared
Het xliff schema begint met de volgende twee regels:

XML:
1
2
3
<xsd:schema xmlns:xlf="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:xliff:document:1.2" xml:lang="en">
  <!-- Import for xml:lang and xml:space -->
  <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>


Ik kan de schemaLocation weghalen:

XML:
1
2
3
<xsd:schema xmlns:xlf="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:xliff:document:1.2" xml:lang="en">
  <!-- Import for xml:lang and xml:space -->
  <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>


Nu loopt het validatieproces door, maar krijg ik de melding "Could not find schema information for the element 'xliff'".

Ik kan ook de namespace identifier van XMLSchema aanpassen:

XML:
1
2
3
<xsd:schema xmlns:xlf="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:xliff:document:1.2" xml:lang="en">
  <!-- Import for xml:lang and xml:space -->
  <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>


maar dit werkt (uiteraard) ook niet; .Net geeft de foutmelding: "The root element of a W3C XML Schema should be <schema> and its namespace should be 'http://www.w3.org/2001/XMLSchema'."

Ik weet niet wat ik nog meer aan zou kunnen passen.
http://londata.svnrepository.com/xmlcatalog.net/trac.cgi/ is ook een mooie trouwens, vraag is enkel of dat nog aan KISS voldoet.
Ah ja, daar heb ik ook naar gekeken. Het lijkt me inderdaad wat overkill voor het valideren van een xml document -- zeker aangezien deze validatie niet strikt noodzakelijk is, maar een extra nice-to-have. Er zullen geen kernkoppen per ongeluk worden gelanceerd als het xml document niet voldoet aan de specs. Hoop ik.

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "