2017-08-17 3 views
2

J'ai ce morceau de code qui valide XML contre XSDvalidation Xml contre les personnages xsd et CRLF

public void Validate() 
    { 
     XDocument xdoc = XDocument.Load("XML path"); 
     var schemas = new XmlSchemaSet(); 
     schemas.Add(null, "XSD path"); 
     xdoc.Validate(schemas, ValidationCallBack); 
    } 

    private void ValidationCallBack(object sender, ValidationEventArgs args) 
    { 
     if (args.Severity != XmlSeverityType.Error) 
      return; 
     throw new XmlSchemaValidationException(args.Message); 
    } 

Si j'ai dans le xsd un élément avec le type de chaîne et a motif ([^ \ t \ r \ n] *) et la balise de valeur xml est

 <tagname> There is LF character here 
    </tagname> 

Il passe de validation mais la valeur de la balise a le caractère de fuite 'LF' seulement. Comment devrait-il être invalide et échoue dans la validation XML? Notez que je ne peux pas modifier dans le xsd

Répondre

4

Il y a plusieurs aspects intéressants à cette question.

L'analyse et la validation de documents XML sont effectuées dans une pile technologique comprenant le décodage, l'analyse, la conversion en un jeu d'informations XML (infoset) et la validation par rapport à un schéma XML.

  • Avant l'analyse, la spécification XML dit que any CR characters are replaced with LF characters (ou supprimées si elles apparaissant comme CR LF), ne laissant que des caractères LF. L'analyseur ne verra donc aucun caractère CR sauf dans certains cas. Lors de la conversion en infoset, les espaces blancs (y compris LF) apparaissant en dehors de l'élément document (ce que je comprends de "trailing" dans la question: il y a aussi le concept d'espace blanc de fin dans les attributs) sont omis. Ainsi, lorsque l'infoset XML du document a été construit, there is no information left about trailing white space.

  • La validation de schéma XML est effectuée par rapport à l'ensemble d'informations ci-dessus, ce qui signifie que le schéma ne verra pas non plus d'espaces blancs de fin.

Vérification des caractères de fin de CR ou LF dans l'instance, même si elle est logique, est donc hors du champ de la validation du schéma et doit être fait avec d'autres outils avant de la phase de traitement XML.

+0

Y at-il un moyen efficace de vérifier s'il y a un caractère 'CR'? – Sumthg

+0

Vous pouvez uniquement effectuer cette vérification sur le document non analysé. Mais pourquoi voudriez-vous, puisque la spécification XML indique que les caractères CR sont ignorés de toute façon? –

+0

@MichaelKay vérifier le poste est modifié pour plus de clarification – Sumthg