what - Como gerar documentos XML de amostra a partir de seu DTD ou XSD?




xml w3schools dtd (13)

Estamos desenvolvendo um aplicativo que envolve uma quantidade substancial de transformações XML. Não temos dados de teste de entrada adequados, apenas arquivos DTD ou XSD. Gostaríamos de gerar nossos dados de teste nós mesmos a partir desses arquivos. Existe uma maneira fácil / gratuita de fazer isso?

Editar

Aparentemente, não há ferramentas gratuitas para isso, e eu concordo que o OxygenXML é uma das melhores ferramentas para isso.


A Microsoft publicou uma ferramenta "gerador de documentos" como amostra. Este é um artigo que descreve a arquitetura e a operação do aplicativo de amostra com algum detalhe.

Se você quiser apenas executar a ferramenta de geração de amostra, clique aqui e instale o MSI.

É grátis. A fonte está disponível. Requer o .NET Framework para ser executado. Funciona apenas com XSDs. (não Relax NG ou DTD).


A biblioteca OpenXSD menciona que eles têm suporte para gerar instâncias XML com base no XSD. Dê uma olhada.


Em versões recentes do Eclipse IDE de código livre e aberto, você pode gerar documentos XML a partir de arquivos DTD e XSD. Clique com o botão direito do mouse em um determinado arquivo * .dtd ou * .xsd e selecione "Generate -> XML File ...". Você pode escolher qual elemento-raiz gerar e se atributos e elementos opcionais devem ser gerados.

É claro que você também pode usar o Eclipse para criar e editar seus arquivos de esquema DTD e XSD. E você não precisa instalar nenhum plug-in. Está incluído na distribuição padrão.


Eu acho que Oxygen ( http://www.oxygenxml.com/ ) faz isso também, mas esse é outro produto comercial. É um bom, embora ... Eu recomendo fortemente para quem faz muito trabalho XML. Ele vem em um bom plugin Eclipse também.

Eu acredito que há um teste gratuito de 30 dias.


No Visual Studio 2008 SP1 e posterior, o XML Schema Explorer pode criar um documento XML com alguns dados de amostra básicos:

  1. Abra o seu documento XSD
  2. Mude para o XML Schema Explorer
  3. Clique com o botão direito do mouse no nó raiz e escolha "Generate Sample Xml"


O Liquid XML Studio possui um assistente de Gerador de Amostra XML que criará arquivos XML de amostra a partir de um Esquema XML. Os dados resultantes parecem estar em conformidade com o esquema (ele simplesmente não pode gerar dados para padrões de regex).


O XMLBlueprint 7.5 pode fazer o seguinte: - gerar amostra de xml a partir de dtd - gerar amostra de xml a partir do esquema de relaxamento - gerar amostra de xml a partir do esquema xml


O camprocessador disponível no Sourceforge.net fará a geração de casos de teste xml para qualquer XSD. Existe um tutorial disponível para mostrar como gerar seus próprios exemplos de teste - incluindo o uso de dicas de conteúdo para garantir exemplos realistas, não apenas aleatórios.

O tutorial está disponível aqui: http://www.oasis-open.org/committees/download.php/29661/XSD%20and%20jCAM%20tutorial.pdf

E mais informações sobre a ferramenta - que está usando o padrão OASIS Content Assembly Mechanism (CAM) para refatorar seu XSD em uma estrutura mais amigável XSLT - podem ser encontradas no site de recursos - http://www.jcam.org.uk

Aproveite, DW


Para usuários do Intellij Idea:

Dê uma olhada em Ferramentas -> Ações XML

Parece funcionar muito bem (até onde eu testei).

Editar:

Como mencionado pelo @naXa, agora você também pode clicar com o botão direito do mouse no arquivo XSD e clicar em "Gerar documento XML do esquema XSD ..."


Parece que ninguém foi capaz de responder à pergunta até agora :)

Eu uso o MOXy do EclipseLink para gerar dinamicamente classes de ligação e, em seguida, recursivamente percorrer os tipos ligados. É um pouco pesado, mas permite injeção de valor de XPath quando a árvore de objetos é instanciada:

InputStream in = new FileInputStream(PATH_TO_XSD);
DynamicJAXBContext jaxbContext = 
            DynamicJAXBContextFactory.createContextFromXSD(in, null, Thread.currentThread().getContextClassLoader(), null);
DynamicType rootType = jaxbContext.getDynamicType(YOUR_ROOT_TYPE);
DynamicEntity root = rootType.newDynamicEntity();
traverseProps(jaxbContext, root, rootType, 0);

TraverseProps é um método recursivo bastante simples:

private void traverseProps(DynamicJAXBContext c, DynamicEntity e, DynamicType t, int level) throws DynamicException, InstantiationException, IllegalAccessException{
        if (t!=null) {
            logger.info(indent(level) + "type [" + t.getName() + "] of class [" + t.getClassName() + "] has " + t.getNumberOfProperties() + " props");
            for (String pName:t.getPropertiesNames()){
                Class<?> clazz = t.getPropertyType(pName);
                logger.info(indent(level) + "prop [" + pName + "] in type: " + clazz);
                //logger.info("prop [" + pName + "] in entity: " + e.get(pName));

                if (clazz==null){
                    // need to create an instance of object
                    String updatedClassName = pName.substring(0, 1).toUpperCase() + pName.substring(1);
                    logger.info(indent(level) + "Creating new type instance for " + pName + " using following class name: " + updatedClassName );
                    DynamicType child = c.getDynamicType("generated." + updatedClassName);
                    DynamicEntity childEntity = child.newDynamicEntity();
                    e.set(pName, childEntity);
                    traverseProps(c, childEntity, child, level+1);
                } else {
                    // just set empty value
                    e.set(pName, clazz.newInstance());
                }
            }
        } else {
            logger.warn("type is null");
        }
    }

Converter tudo em XML é bem fácil:

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);

Você também pode usar o XMLPad (livre para usar) encontrado aqui http://www.wmhelp.com para gerar suas amostras xml. No menu: XSD -> gerar arquivo XML de amostra.



XMLSpy faz isso para você, embora não seja de graça ...

Acredito que o Liquid Xml Studio faz isso por você e é gratuito, mas eu pessoalmente não o usei para criar dados de teste.







test-data