Pergunta

Eu tenho alguns métodos WCF que são utilizados para informações de transmissão a partir de uma aplicação de servidor para uma interface site para uso em ligação. Estou enviando o resultado como um XElement que é a raiz de uma árvore XML que contém os dados que deseja vincular contra.

Eu gostaria de criar alguns testes que examinam os dados e garantir que ele aparece como esperado.

Meu pensamento atual é esta: Cada método que retorna uma árvore XElement tem um arquivo correspondente esquema (.XSD). Este arquivo está incluído no conjunto que contém minhas aulas WCF como um recurso incorporado.

testes chamar o método sobre esses métodos e compara o resultado contra esses esquemas embutidos.

Esta é uma boa ideia? Se não, que outras maneiras que eu posso usar para fornecer uma "garantia" de que tipo de XML um método retornará?

Se for, como é que você validar um XElement contra um esquema? E como eu posso obter esse esquema do conjunto que está incorporado em?

Foi útil?

Solução

id dizer validar XML com um esquema XSD é uma boa idéia.

Como validar um XElement com o esquema carregado: Como você pode ver neste exemplo que você precisa para validar o XDocument primeiro a receber preencher o "infoset post schema validação" (Pode haver uma solução para fazer isso sem usar o método Validar na XDocument mas Im ainda de encontrar um):

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

Como ler o esquema incorporado a partir de uma montagem e adicioná-lo ao 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));

Outras dicas

Se você estiver fazendo algum trabalho leve e XSDs são um exagero, considere também a digitação possivelmente fortemente seus dados XML. Por exemplo, eu tenho um número de classes em um projeto que derivam de XElement. Um deles é ExceptionXElement, outra é HttpHeaderXElement, etc. Neles, eu herdar de XElement e adicionar Parse e TryParse que levam seqüências contendo dados XML para criar uma instância de. Se TryParse () retorna false, a string não estar de acordo com os dados XML que eu esperava (o elemento raiz tem o nome errado, elementos crianças desaparecidas, etc.).

Por exemplo:

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...
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top