Különféle xsd-ellenőrzési típusokat fedeztem fel a XmlDocument.Validate(ValidationEventHandler)
, XDocument.Validate(schemas, ValidationEventHandler)
és XmlReader
használatával, egy olyan sémával, amely egy ValidationEventHandler
visszahívásra küldi az eredményeket.
A visszahívás azonban gyakorlatilag csak a súlyosságot és a hibaüzenetet adja meg. Ilyen üzeneteket kapok:
The 'name' attribute is invalid - The value '' is invalid according to
its datatype 'TNonEmptyStringNoWhitespacesAtBeginningAndEnd' - The
Pattern constraint failed.
Most messze nem ideális hibaüzenetek. A visszahívási paraméterek nem adják meg, hogy ezt melyik szülő okozta, sem azt, hogy milyen XML-sorról van szó, sem semmi praktikus dolgot.
Az én forgatókönyvemben nem minden név a fenti típusú, némelyik egyszerűen üres karakterlánc lehet (mivel nem kötelező).
Most, hogy valószínűleg több száz névvel rendelkező xml-csomópont van, nagyon bosszantó a fenti probléma felkutatása, mivel nincs környezeti információ a helyről, még az sem, hogy mi az xml-csomópont.
Hogyan lehet kiterjeszteni egy ilyen érvényesítés bőbeszédűségét? A Notepad++ például egy XML Tools beépülő modult használ, amely a fenti üzenetet a következőképpen adja ki:
Az aktuális fájl érvényesítése XML-séma használatával:
ERROR: Element 'LightSource', attribute 'name': [facet 'minLength'] The value '' has a length of '0'; this underruns the allowed minimum length of '1'.
ERROR: Element 'LightSource', attribute 'name': [facet 'pattern'] The value '' is not accepted by the pattern '.*\S'.
ERROR: Element 'LightSource', attribute 'name': '' is not a valid value of the atomic type 'TNonEmptyStringNoWhitespacesAtBeginningAndEnd'.
Ez bőbeszédű, és legalább néhány kontextus-információt jelez, például a probléma egy LightSource elemen jelenik meg, és hogy pontosan mi hibázott a mögöttes típussal.
Vannak más lehetőségek, amelyek lehetővé teszik a megfelelő C# XSD érvényesítést megnövelt környezeti információkkal?
Az érvényesítések az XML memórián belüli megjelenítésén történtek XDocument
és XmlDocument
szempontjából, valamint a XmlReader
fájlból olvasva. Nyilvánvalóan a sorszámoknak stb. csak olyan kontextusban lenne értelme, ahol egy xml fájl már meg van írva, de más információk, mint például a szülőelem stb., hasznosak lennének, így legalább az xml-környezetet kiadhatnám, ahol megnézhetem.
A teljesség kedvéért néhány kód:
var schemas = new XmlSchemaSet();
schemas.Add("", xsdPath);
var doc = XDocument.Load(xmlFile);
doc.Validate(schemas,ValidationEventHandler);
public void ValidationEventHandler(object sender, ValidationEventArgs e)
{
// Not much in e
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Warning {0}", e.Message);
break;
}
}
Egy másik ígéretesnek tűnő próbálkozás a http://msdn.microsoft.com/en-us/library/as3tta56%28v=vs.110%29.aspx, de egyáltalán nem növelte a bőbeszédűséget.
Néhány magyarázat a fennmaradó részhez.
Van néhány típusom, amely korlátozást képez:
<xs:simpleType name="TNonEmptyStringNoWhitespacesAtBeginn">
<xs:restriction base="xs:string">
<xs:pattern value="\S.*" />
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TNonEmptyStringNoWhitespacesAtBeginningAndEnd">
<xs:restriction base="TNonEmptyStringNoWhitespacesAtBeginn">
<xs:pattern value=".*\S" />
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
Hagyja figyelmen kívül a TNonEmptyStringNoWhitespacesAtBeginn
, amely segít az ÉS-korlátozások engedélyezéséhez. Tehát ha van egy name
attribútum a fenti típussal, amely csak egy üres karakterlánc, nagyon eltérő mennyiségű információt kapok a C#s XSD érvényesítéséből és abból, amit a Notepads++ XML Tools Plugin csinál. Íme a különböző üzenetek a teljesség kedvéért:
C#
The 'name' attribute is invalid - The value '' is invalid according to
its datatype 'TNonEmptyStringNoWhitespacesAtBeginningAndEnd' - The
Pattern constraint failed.
Jegyzettömb++
ERROR: Element 'LightSource', attribute 'name': [facet 'minLength'] The value '' has a length of '0'; this underruns the allowed minimum length of '1'.
ERROR: Element 'LightSource', attribute 'name': [facet 'pattern'] The value '' is not accepted by the pattern '.*\S'.
ERROR: Element 'LightSource', attribute 'name': '' is not a valid value of the atomic type 'TNonEmptyStringNoWhitespacesAtBeginningAndEnd'.
A kivételtartalom által biztosított információkkal lekérhetem és megjeleníthetem az XML-elemet, de azt mondani, hogy a TNonEmptyStringNoWhitespacesAtBeginningAndEnd
megszorítása sikertelen, sokkal kevésbé kifejező, mintha azt mondanám, hogy a részletek melyik része hibásodott meg. Tudom, hogy értem a tippet, hogy a minta megszorítása meghiúsult, de bárkinek, aki ilyen üzenetet kap, meg kell találnia a típust, és meg kell vizsgálnia a megszorításait, hogy megismerje a kényszert. Ha megvizsgáljuk a kivétel adatait, úgy tűnik, ez itt a részletezési szint.
Úgy tűnik, hogy az XML Tools Plugin képes minden egyes érvényesítési elemet sokkal részletesebben megjeleníteni. Ez nem csak az XSD-ből következtethető, inkább úgy néz ki, mint az egyes megszorítások feldolgozási lépései által nyert információ.
Amit reméltem, az az volt, hogy növeljem az érvényesítő szóhasználatát, hogy több információhoz jussak.