11
votes

Validation XML sur XSD avec les numéros de ligne d'erreur

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?

Le lecteur XMLreader n'autorise pas les numéros de ligne, il ne montre que le nom de l'élément.


0 commentaires

6 Réponses :


1
votes

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


0 commentaires

7
votes

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);
}


3 commentaires

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); Voir : MSDN


La réponse devrait être de charger avec le SetlineInfo et PRESERVEWHITESPACE SET SET, THE SETBASEURI 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!



0
votes

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);


0 commentaires

2
votes

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;
    }
}


0 commentaires

1
votes

Essayez cet exemple de travail. ixmllineinfo 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. XXX


0 commentaires

6
votes

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: xxx


0 commentaires