7
votes

Comment valider un document XML contre une DTD en C #?

Je ne veux rien faire de fantaisie, je veux juste m'assurer qu'un document est valide et imprimer un message d'erreur si ce n'est pas le cas. Google m'a signalé à This , mais il semble que xmlvalidingreader est obsolète (au moins, c'est ce que le monodevelop raconte Moi).

Edit: J'essaie le conseil de Mehrdad, mais j'ai des problèmes. Je pense avoir le plus de cela, mais je ne trouve que survalidationeventer n'importe où. Où aller je reçois onvalidationation of? xxx


2 commentaires

Au fait, qu'entendez-vous par «conversion de C #». Mon code est en C # 3.0.


@Mehrdad: Désolé, j'ai écrit que pendant que j'apprendais toujours C # 1.0, et je ne savais pas que var était valide en C #.


4 Réponses :


6
votes

au lieu de créer xmlvaliditingReader classe directement, vous devez construire un xmlreadersettings Objet et transmettez-le comme une dispute sur Xmlreader.create méthode : xxx

Le reste est inchangé.

ps OnvalidationEvent est le nom de la méthode que vous déclarez à gérer les événements de validation. Évidemment, vous pouvez supprimer la ligne si vous ne souhaitez pas vous abonner à des événements de validation soulevés par le xmlreader .


1 commentaires

Matthew: C'est la méthode que vous déclareriez à gérer les événements de validation échoués. Vous pouvez supprimer cette ligne si vous voulez que cela jette une exception à la place.



3
votes
var messages = new StringBuilder();
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD };
settings.ValidationEventHandler += (sender, args) => messages.AppendLine(args.Message);
var reader = XmlReader.Create("file.xml", settings);

if (messages.Length > 0)
{
    // Log Validation Errors
    // Throw Exception
    // Etc.
}
ValidationEventHandlerLambda ExpressionsType Inference

2 commentaires

Euh, je n'ai pas donné à la même réponse de Mehrdad, 22 minutes avant de le faire?


Cette réponse est une manière différente d'accomplir la même chose.



-1
votes

description complète:

  1. Dans Visual Studio .NET, créez un nouveau Visual C # Application console projet nommé ValidateXml code>. Ajouter deux déclarations en utilisant au début de Class1.cs suit comme: p>

    Validation event
    Element 'Product' has invalid content. Expected 'ProductName'.
    An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5).
    Document is invalid
    
  2. Dans Class1.cs code>, déclarer une variable booléenne nommée isValid code> avant la début de la méthode principal code> comme suit: p>

    public static void MyValidationEventHandler(object sender, 
                                                ValidationEventArgs args) 
    {
       isValid = false;
       Console.WriteLine("Validation event\n" + args.Message);
    }
    
  3. Créer un XmlTextReader code> pour lire un document XML à partir d'un texte fichier dans le principal code>, puis créer un XmlValidatingReader code> valider ces données XML comme suit: p>

    while (v.Read())
    {
       // Can add code here to process the content.
    }
    v.Close();
    
    // Check whether the document is valid or invalid.
    if (isValid)
       Console.WriteLine("Document is valid");
    else
       Console.WriteLine("Document is invalid");
    
  4. ValidationType code> de XmlValidatingReader code> indique le type de validation qui est nécessaire (DTD, XDR, ou Schéma). Définissez cette propriété sur DTD comme suit: p>

    v.ValidationEventHandler += 
       new ValidationEventHandler(MyValidationEventHandler);
    
  5. Si des erreurs de validation se produisent, le lecteur de validation génère un événement de validation. Ajoutez le code suivant pour enregistrer une validation gestionnaire d'événements (vous mettre en œuvre le MyValidationEventHandler code> Procédé à l'étape 7): p>

    v.ValidationType = ValidationType.DTD;
    
  6. Ajoutez le code suivant pour lire et valider le document XML. Si seulement des erreurs de validation se produisent, MyValidationEventHandler code> est appelé à l'erreur est corrigée. Ceci définit la méthode isValid code> false (voir l'étape 8). Vous pouvez vérifier l'état de isValid code> après validation pour voir si le document est valide ou non valide. p>

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml");
    XmlValidatingReader v = new XmlValidatingReader(r);
    
  7. Ecrire la méthode MyValidationEventHandler code> après la balise principal code> Méthode suit: p>

    private static bool isValid = true;      // If a validation error occurs,
                                             // set this flag to false in the
                                             // validation event handler. 
    


1 commentaires

MEH - Ceci est juste une copie / pâte de certains échantillons de MSDN, près de Verbatim. À tout le moins, fournissez une référence: support.microsoft.com/kb/307379



0
votes

J'ai mentionné cet exemple sur la validation DTD. https: // docs.microsoft.com/en-us/dotnet/api/system.xml.xmlreadersettings.viewprocessing?view=netcore-3.1#input

Cet exemple a invalide DTD XML, que j'ai corrigé comme ci-dessous . P>

<!--XML file using a DTD-->
<!DOCTYPE store [
  <!ELEMENT store (item)*> 
  <!ELEMENT item (name,dept,price)>
  <!ATTLIST item type CDATA #REQUIRED ISBN CDATA 
#REQUIRED>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT dept (#PCDATA)>
  <!ELEMENT price (#PCDATA)>]>
<store>
  <item type="supplies"  ISBN="2-3631-4">
    <name>paint</name>
    <dept>1</dept>
    <price>16.95</price>
  </item>
</store>


0 commentaires