Question

Certaines méthodes WCF sont utilisées pour transmettre des informations d'une application serveur à une interface Web afin de les utiliser dans la liaison. J'envoie le résultat sous la forme d'un XElement qui est la racine d'un arbre XML contenant les données avec lesquelles je souhaite créer un lien.

J'aimerais créer des tests qui examinent les données et s'assurent qu'elles apparaissent comme prévu.

Ma pensée actuelle est la suivante: chaque méthode renvoyant une arborescence XElement correspond à un fichier de schéma (.XSD) correspondant. Ce fichier est inclus dans l'assembly qui contient mes classes WCF en tant que ressource incorporée.

Les tests appellent la méthode sur ces méthodes et comparent le résultat à ces schémas incorporés.

Est-ce une bonne idée? Sinon, quels autres moyens puis-je utiliser pour fournir une "garantie"? de quel type de XML une méthode retournera-t-elle?

Si tel est le cas, comment valider un XElement par rapport à un schéma? Et comment puis-je obtenir ce schéma à partir de l'assemblage dans lequel il est intégré?

Était-ce utile?

La solution

Je dirais que valider xml avec un schéma xsd est une bonne idée.

Comment valider un XElement avec le schéma chargé: Comme vous le voyez dans cet exemple, vous devez d'abord valider le document XDocument pour renseigner le & infos; infoset post-schéma-validation " (Il pourrait y avoir une solution pour le faire sans utiliser la méthode Validate sur le document XDO, mais je n’en ai pas encore trouvé):

String xsd =
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
   <xsd:element name='root'>
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element name='child1' minOccurs='1' maxOccurs='1'>
       <xsd:complexType>
        <xsd:sequence>
         <xsd:element name='grandchild1' minOccurs='1' maxOccurs='1'/>
         <xsd:element name='grandchild2' minOccurs='1' maxOccurs='2'/>
        </xsd:sequence>
       </xsd:complexType>
      </xsd:element>
     </xsd:sequence>
    </xsd:complexType>
   </xsd:element>
  </xsd:schema>";
String xml = @"<?xml version='1.0'?>
<root>
    <child1>
        <grandchild1>alpha</grandchild1>
        <grandchild2>beta</grandchild2>
    </child1>
</root>";
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsd)));
XDocument doc = XDocument.Load(XmlReader.Create(new StringReader(xml)));
Boolean errors = false;
doc.Validate(schemas, (sender, e) =>
{
    Console.WriteLine(e.Message);
    errors = true;
}, true);
errors = false;
XElement child = doc.Element("root").Element("child1");
child.Validate(child.GetSchemaInfo().SchemaElement, schemas, (sender, e) =>
{
    Console.WriteLine(e.Message);
    errors = true;
});

Comment lire le schéma incorporé à partir d'un assembly et l'ajouter à XmlSchemaSet:

Assembly assembly = Assembly.GetExecutingAssembly();
// you can use reflector to get the full namespace of your embedded resource here
Stream stream = assembly.GetManifestResourceStream("AssemblyRootNamespace.Resources.XMLSchema.xsd");
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(null, XmlReader.Create(stream));

Autres conseils

Si vous effectuez des tâches légères et que les fichiers XSD sont excessifs, envisagez également de taper fortement vos données XML. Par exemple, un projet contient plusieurs classes dérivées de XElement. L'une est ExceptionXElement, une autre est HttpHeaderXElement, etc. J'y hérite de XElement et ajoute les méthodes Parse et TryParse qui prennent des chaînes contenant des données XML pour créer une instance. Si TryParse () renvoie false, la chaîne n'est pas conforme aux données XML attendues (l'élément racine porte un nom incorrect, des éléments enfants manquants, etc.).

Par exemple:

public class MyXElement : XElement 
{

    public MyXElement(XElement element)
        : base(element)
    { }

    public static bool TryParse(string xml, out MyXElement myElement)
    {
        XElement xmlAsXElement;

        try
        {
            xmlAsXElement = XElement.Parse(xml);
        }
        catch (XmlException)
        {
            myElement = null;
            return false;
        }

        // Use LINQ to check if xmlAsElement has correct nodes...
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top