Y a-t-il un moyen de valider un fichier XML sur un schéma XSD avec la sortie des numéros de ligne d'erreur? p>
Le lecteur XMLreader n'autorise pas les numéros de ligne, il ne montre que le nom de l'élément. P>
6 Réponses :
Vous pouvez utiliser xmlstarlet . Cela prend en charge la validation et fournit des numéros de ligne d'erreur:
$ xml val -e --xsd file.xsd file.xml file.xml:8: Element 'atitle': This element is not expected. Expected is ( title ). file.xml - invalid
Voir l'exemple MSDN d'origine:
http://msdn.microsoft .com / fr-US / bibliothèque / ms172454.aspx p>
validationEventargs ValidationEventargs argument a exception.Linenumber: p>
private void SchemaValidationEventHandler(object sender, ValidationEventArgs e) {
Console.WriteLine("XML {0}: {1} (Line {2})",
e.Severity,
e.Message,
e.Exception.LineNumber);
}
J'ai peut-être manqué quelque chose, mais exécutant cet exemple donne toujours linenumber = 0. Cet exemple fonctionne mieux.
Si vous pouvez utiliser .NET 3.5: Il est important de charger le xdocument avec les informations de numéro de ligne: xdocument doc = xdocument.load (filtream, loadoption.Surservewhitefo | loadoption.setbaseuri); code> Voir : MSDN
La réponse devrait être de charger avec le SetlineInfo Code> et PRESERVEWHITESPACE CODE> SET SET, THE SETBASEURI CODE> Ne semble pas faire une grande partie de quelque chose à cet effet. @schoetbi devrait repousser son commentaire comme une réponse. C'est la vraie résolution!
Cet exemple est le plus complet que j'ai trouvé. Il est plus lent que d'autres méthodes de validation, mais c'est le meilleur pour le débogage: il écrit des éléments validés pour chaque ligne et erreurs trouvées.
Pour avoir des nombres de lignes avec des erreurs, ajoutez simplement cette ligne dans validationHandler code> P> Console.WriteLine(args.Exception.LineNumber);
woah, plutôt délicat ce truc de xsd, je suis aussi nouveau :)
Comme il a été dit avant que les informations de position soient perdues dans le xmldocument. P>
Je l'ai enfin en cours d'exécution à l'aide de la xmlreader En combinaison avec XMLDOCUMUMUMUMUMUMUMENT: P>
private void ValidationEventHandler(object sender, ValidationEventArgs e)
{
// This actually works with this approach
string text = $"[Line: {e.Exception?.LineNumber}, Column: {e.Exception?.LinePosition}]: {e.Message}";
switch (e.Severity) {
case XmlSeverityType.Error:
Logger.Error(text);
break;
case XmlSeverityType.Warning:
Logger.Warn(e.Message);
break;
}
}
Essayez cet exemple de travail. ixmllineinfo code> vous obtient les informations de ligne.
Je reçois la liste des erreurs ici, concaténant le numéro de ligne, ID unique de cet enregistrement spécifique, le nom de l'élément où l'erreur s'est produite et l'ajout à une liste.
Depuis @ Chris-Watts suggéré de poster mon commentaire à nouveau comme réponse. Ici, c'est.
Le document n'a que des informations de numéro de ligne s'il a été chargé avec les indicateurs appropriés: p>