9
votes

Validation de schéma XML

J'ai un fichier XSD et un fichier XML, comment puis-je vérifier si le XML est dans le bon schéma comme le fichier XSD?

Je sais qu'il existe une fonction de validation dans la classe xmldocument , mais il a besoin d'un gestionnaire d'événements et tout ce dont j'ai besoin est vrai ou faux.

P.s. Je travaille à Invisuel Studio 2010.


0 commentaires

3 Réponses :


3
votes

Vous pouvez créer une instance XMLReader validant à l'aide de la classe XMLReaderSettings et de la méthode de Création.

bool isXmlValid = ValidateXml(@"D:\Sample.xml", 
                              @"D:\SampleSchema.xsd", 
                              @"http://www.w3.org/2001/XMLSchema", 
                              typeof(note));


5 commentaires

Cela ne validera rien puisque aucun validationflags n'est défini. Cela va simplement désérialiser le XML.


Que dois-je entrer en tant que rotintype?


Rootype est le type de l'élément racine du modèle de classe créé à partir du fichier XSD. Par exemple, si vous créez un modèle de classe (à l'aide de l'outil XSD.exe de .NET), le type serait «Produit» (pour l'exemple XSD donné par @steven).


Créez une hiérarchie de classe à l'aide de l'outil XSD de .NET. Par exemple, si le fichier de schéma est à «D: \ testschema.xsd», l'utilisation de l'outil doit être> XSD / C / OUT: D: \ "D: \ TESTSCHEMA.XSD". Ceci est un outil de ligne de commande. Pour plus d'informations: msdn.microsoft.com/ EN-US / Bibliothèque / X6C1KB0S% 28V = vs.100% 29.aspx


Ah? Quelle est la connexion au type? Comment suis-je supposé écrire le type?



1
votes

Vous pouvez faire quelque chose comme ça.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="Product">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="ProductName" type="xsd:string"/>
         </xsd:sequence>
         <xsd:attribute name="ProductID" use="required" type="xsd:int"/>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>


6 commentaires

Comment puis-je le faire sans entrer dans tous les XML à l'appel de la fonction? Et ce que la boucle "tandis que" supposait faire? et comment la fonction utilise le schéma?


Vous pouvez passer un chemin vers la fonction de validate et faire "VAR VERSE = XMLReader.create (chemin, paramètres);" au lieu de 'varecteur var = xmlreader.create (nouveau stringreader (XML), paramètres);'


d'accord. Mais quelle est la boucle "tant que" supposé faire? et comment la fonction utilise le schéma?


La boucle TIM a analysé le document XML et dans le processus valide le XML. Le XML contient une référence au schéma: w3.org/2001/xmlschema-instance " "XSI: NonamaSpacesChamalocation =" "schema.xsd" ">


une. Quel est le code qui doit écrire dans la boucle tandis que? b. Et si je n'ai pas de référence dans le code au schéma, c'est dans les propriétés. cela fonctionnerait-il?


A: rien, vous pouvez le laisser comme: tandis que (lecteur.read ()); B: lorsque le schéma est situé dans le répertoire d'exécution et il est référencé comme: alors cela fonctionnera.



24
votes

Il y a un moyen beaucoup plus facile de le faire:

private void ValidationCallBack(object sender, ValidationEventArgs e)
{  
    throw new Exception();
}

public bool validate(string sxml)
{
    try
    {
        XmlDocument xmld=new XmlDocument ();
        xmld.LoadXml(sxml);
        xmld.Schemas.Add(null,@"c:\the file location");
        xmld.validate(ValidationCallBack);
        return true;
    }
    catch
    {
        return false;
    }
}


2 commentaires

Merci, c'est exactement ce dont j'avais besoin aussi!


Incroyablement simple par rapport aux autres solutions, merci!