Como gerar documentos XML de amostra de seus DTD ou XSD?

186

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 a partir desses arquivos. Existe uma maneira fácil / gratuita de fazer isso?

Editar

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

lindelof
fonte
8
Eu não consigo ver as respostas para estas questões que não se encaixam no Q & A de formato, ou solicitardebate, arguments, polling, or extended discussion
mjn

Respostas:

29

Eu acho que o Oxygen ( http://www.oxygenxml.com/ ) também faz isso, mas esse é outro produto comercial. É uma boa, no entanto ... eu recomendo fortemente para qualquer pessoa que faça muito trabalho em XML. Ele também vem em um bom plug-in do Eclipse.

Acredito que exista um teste gratuito de 30 dias com todos os recursos.

levand
fonte
Eu tenho um monte de XSDs que, por sua vez, herda esquemas de diferentes XSDs e preciso gerar um arquivo XML para fins de teste a partir deste XSD, estou usando o oxygenXML para fazer isso, mas quando tento fazê-lo, ele não está funcionando para mim e diz por favor, defina o nó raiz, mas ele não me permite fazê-lo. Então, se alguém tivesse trabalhado com o oxigênioXML, sugira o que poderia ser feito para isso?
2140 Rachel
Obrigado leveland. Isso respondeu à minha pergunta também! Se você gostaria de responder à minha pergunta: stackoverflow.com/questions/7041388/… , ficaria feliz em marcar a sua como a resposta.
Eric H
179

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

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

Captura de tela do XML Schema Explorer

Sam Warwick
fonte
15
Sim, esta é a maneira mais fácil. Abra o XSD, alterne para o XML Schema Explorer, selecione o nó raiz, clique com o botão direito do mouse e escolha "Generate Sample Xml".
22909 balint
+1 Obrigado @ Sam Warwick e @balint. Isso foi realmente útil!
Jessegavin
3
Usei isso com o VS2008, mas não consigo encontrá-lo no VS2010. Alguém pode confirmar que isso ainda existe?
Simon
O mesmo que Simon: também não consigo encontrar isso no VS2010. De acordo com o MSDN, ele ainda deve estar lá, mas simplesmente não aparece em nenhum lugar da interface do usuário ... :-( #
287 Martijn
6
@ Simon: você só obtém o "Generate Sample XML" quando clica com o botão direito do mouse em um dos elementos no explorador de esquema. Os elementos são representados graficamente através dos colchetes verdes do ângulo esquerdo / direito: "<>". Você provavelmente está clicando com o botão direito do mouse em um tipo, e a mensagem de geração só a gera para elementos (o que faz sentido).
Miguel Sevilla
126

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

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

Florian Fankhauser
fonte
Obrigado! O Eclipse é gratuito e esta foi a solução perfeita.
Akku
Vocês sabem qual recurso do Eclipse fornece essa funcionalidade? Meu submenu "Gerar" possui "JAXB Classes" como o único item.
Otto.poellath
9
Você precisa instalar o Web Tools Project (consulte Ajuda-> Instalar novo software) para obter essas opções.
pwaring
3
O Eclipse parece ser uma boa opção, mas não consegui fazer a geração seguir os XSDs importados. Por exemplo, se eu tivesse um XSD descrevendo 3 elementos e um deles fosse um complexType definido em um XSD referenciado / importado, ele não seria gerado para esse elemento. Alguma ideia?
David Hergert
@DavidHergert Uma solução simples seria gerar um tipo de stub.
precisa
32

Para usuários do Intellij Idea:

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

insira a descrição da imagem aqui

Parece funcionar muito bem (tanto quanto eu testei).

Editar:

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

yamass
fonte
existe uma maneira de especificar o número de elementos a serem gerados (para sequências)?
Nikita
Eu testei cada solução deste segmento e isso funcionou o melhor
FLX
1
Não funciona para mim no RubyMine mais recente (v. 7.0, baseado no Intellij Idea) com XSD com muitas importações. Não tenho nada além de mensagem de erro.
Envek
3
"Erro de compilação do esquema"?
The Red Pea
1
Nas versões mais recentes, clique com o botão direito do mouse em XSD e selecione "Gerar documento XML a partir do esquema XSD ..."
naXa
12

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 lixo eletrônico 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 compatível com XSLT - podem ser encontradas no site do recurso - http://www.jcam.org.uk

Aprecie, DW


fonte
3
O link direto para o download do Sourceforge.net é: sourceforge.net/projects/camprocessor
@ Pyderman - essas são as suas configurações - veja como alterá-las.
Ghoti 30/03
10

Você pode usar o XML Instance Generator, que faz parte do Sun / Oracle Multi-Schema Validator .

É README.txt afirma:

O Sun XML Generator é uma ferramenta Java para gerar várias instâncias XML a partir de vários tipos de esquemas. Ele suporta DTD, espaço para nome RELAX, RELAX Core, TREX e um subconjunto do W3C XML Schema Part 1. [...]

Esta é uma ferramenta de linha de comando que pode gerar instâncias válidas e inválidas a partir de esquemas. Ele pode ser usado para gerar casos de teste para aplicativos XML que precisam estar em conformidade com um esquema específico.

Baixe e descompacte xmlgen.zipna página de download do msv e execute o seguinte comando para obter instruções detalhadas de uso:

java -jar xmlgen.jar -help

A ferramenta parece ter sido lançada sob uma licença BSD; o código fonte é acessível a partir daqui

falko
fonte
Muito agradável! Um pouco limitado embora. Eu tentei em um XSD que importa outro XSD e falhou. Mas em um DTD, ele funciona muito bem. Obrigado!
lindelof 15/01/09
1
Links atuais: página inicial , downloads . xmlgen.zipsomente no nigthlydiretório Confirmo a incapacidade de gerar uma amostra do meu xsd.
Jarekczek 7/09/12
No meu caso, precisava usar o --examplearquivo para conter tokens que podem ser usados ​​para gerar um novo arquivo de amostra. É preciso uma amostra para fazer uma amostra! Não é fácil ...
The Red Pea
links java.net estão basicamente mortos.
RedGrittyBrick
10

O XMLSpy faz isso por você, embora isso não seja gratuito ...

Acredito que o Liquid Xml Studio faça isso por você e seja gratuito, mas não o usei pessoalmente para criar dados de teste.

SCdF
fonte
Ele gera alguma coisa, mas você não tem muito controle sobre ele: você pode escolher o elemento de nível superior e algumas opções gerais, mas você não pode usar XMLSpy para gerar um conjunto de casos de teste com muitas variantes etc.
Hans-Peter Storr
O XMLSpy parecia bom, mas gerava um xml que falhou na validação com relação ao xsd usado para gerá-lo. Falhou. Ele também vomitou em um postiveintegercampo - colocando-o *ERROR*em vez disso
Tim Abell
7

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 depois recursivamente passar pelos tipos de ligação. É um pouco pesado, mas permite a injeção de valor XPath depois que 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 é muito fácil:

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

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

Pat B
fonte
Eu recebo um estouro de pilha ou "WMHelp XmlPad parou de funcionar" quando eu escolher "Gerar dados de exemplo"
The Red Pea
5

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

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

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

Cheeso
fonte
O link acima está em um artigo no MSDN chamado 'Gerando documentos XML a partir de esquemas XML'
Sam Warwick
O instalador coloca um monte de código C # em sua máquina. Apenas despeje-os no LinqPad e você terá seu gerador de instâncias XML gratuito. Surpresa!
Sean Kearon
9 anos depois, isso ainda está funcionando muito bem para XSDs.
Mikanikal 25/09
5

XML-XIG: Gerador de Instâncias XML

http://xml-xig.sourceforge.net/

Esse código-fonte seria útil.

rolandpeng
fonte
1
Não é muito amigável. Lança muitas exceções, não pode fazê-lo funcionar depois de ficar inexplicável NullPointerException.
Jarekczek
4

O Microsoft Office possui o ' InfoPath ', que aceita um XSD como importação e permite definir rápida e facilmente um editor baseado em formulário para a criação de arquivos XML. Ele tem dois modos - um em que você define o formulário e outro em que você cria o arquivo XML preenchendo o formulário. Eu acredito que ele veio com o Office 2003 e a maioria das pessoas nunca o instala. Isso me choca com o quanto eu gosto.

Kieveli
fonte
1

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

Peter
fonte
1

A versão de código-fonte aberto do SoapUI pode gerar solicitações SOAP a partir do WSDL (que contém definições de tipo XSD), portanto parece haver uma implementação de código-fonte aberto dessa funcionalidade. Infelizmente, ainda não descobri qual biblioteca é usada para isso.

otto.poellath
fonte
1

O Liquid XML Studio possui um assistente XML Sample Generator que cria arquivos de amostra XML a partir de um esquema XML. Os dados resultantes parecem estar em conformidade com o esquema (apenas não podem gerar dados para padrões de regex).

Gere uma amostra XML a partir de um XSD

Sprotty
fonte
0

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

Aravind Yarram
fonte
você pode postar um exemplo de uso?
NaXa
0

O XML Blueprint também faz isso; instruções aqui

http://www.xmlblueprint.com/help/html/topic_170.htm

Não é gratuito, mas há uma avaliação gratuita de 10 dias; parece rápido e eficiente; infelizmente, é apenas o Windows.

Bambax
fonte