Ferramenta de validação de esquema XML (XSD)? [fechadas]

266

No escritório, estamos atualmente escrevendo um aplicativo que irá gerar arquivos XML em um esquema que nos foi dado. Temos o esquema em um arquivo .XSD.

Existem ferramentas ou bibliotecas que podemos usar para testes automatizados para verificar se o XML gerado corresponde ao esquema?

Preferimos ferramentas gratuitas apropriadas para uso comercial, embora não agrupemos o verificador de esquema, portanto, ele só precisa ser utilizável pelos desenvolvedores durante o desenvolvimento.

Nossa linguagem de desenvolvimento é C ++, se isso faz alguma diferença, embora eu não ache que deveria, pois poderíamos gerar o arquivo xml e, em seguida, fazer a validação chamando um programa separado no teste.

Jason Dagit
fonte
132
Eu amo como muitas destas questões "não construtivas" são resultados de busca do Google de coisas que eu procurar e as respostas são úteis
Matt freake
1
Eu entendo de onde vem vindo com o não construtivo. Honestamente, porém esta é uma grande pergunta e debate / argumentos por vezes, acabam derivando para grandes respostas
Matt
22
este é o caso exato em que os administradores estão sendo contraproducentes
anon58192932
Talvez valha a pena examinar uma questão semelhante no contexto da ferramenta de construção do Maven .
Alberto
Tente codverter.com/src/xmltoxsd
jonathana

Respostas:

239

Após algumas pesquisas, acho que a melhor resposta é o Xerces , que implementa todo o XSD, é multiplataforma e amplamente utilizado. Criei um pequeno projeto Java no github para validar na linha de comando usando o analisador JRE padrão, que normalmente é Xerces. Isso pode ser usado no Windows / Mac / Linux.

Existe também uma versão C ++ do Xerces disponível, se você preferir usá-la. O utilitário StdInParse pode ser usado para chamá-lo na linha de comando. Além disso, um comentarista abaixo aponta para este utilitário mais completo de wrapper .

Você também pode usar xmllint, que faz parte da libxml . Você já pode tê-lo instalado. Exemplo de uso:

xmllint --noout --schema XSD_FILE XML_FILE

Um problema é que o libxml não implementa toda a especificação; portanto, você pode ter problemas :(

Como alternativa, se você estiver no Windows, poderá usar o msxml , mas precisará de algum tipo de wrapper para chamá-lo, como a GUI descrita neste artigo do DDJ . No entanto, parece que a maioria das pessoas no Windows usa um editor de XML, como o Notepad ++ (como descrito na resposta de Nate ) ou o XML Notepad 2007, conforme sugerido por SteveC (também existem vários editores comerciais que não mencionarei aqui).

Por fim, você encontrará diferentes programas que, infelizmente, fornecerão resultados diferentes. Isso se deve em grande parte à complexidade das especificações XSD. Você pode testar seu esquema com várias ferramentas.

ATUALIZAÇÃO : Eu expandi isso em uma postagem no blog .

Adrian Mouat
fonte
1
Achei o seguinte útil: jmvanel.free.fr/xsd/README.html
Matthew Hegarty
Um exemplo de uso do StdinParse (no Linux) pode ser útil: StdInParse -n -s -f -v = sempre <XML_FILE. XML_FILE deve incluir a localização do esquema. Para mim, fornece resultados mais completos que o xmllint.
helcim
3
Existe uma maneira de solicitar que um programa use xsi: schemaLocation em vez de alimentar todos os XSDs manualmente?
Gabor Garami
@GaborGarami Não no momento, mas é um pedido de recurso: github.com/amouat/xsd-validator/issues/5
Adrian Mouat
1
xmllintinfelizmente não é compatível com regex XML, portanto, alguns regexes XML válidos não o passarão #
Sergey Bushmanov
112

Há um plug-in para o Notepad ++ chamado XML Tools que oferece verificação e validação de XML em relação a um XSD.

Você pode ver como usá-lo aqui .

Nate
fonte
5
-1, este plug-in é uma
tarefa difícil de
2
Eu testei com o npp 5.8.6, XMLTools 2.3.1 unicode beta2 r805, ele funciona bem.
Palani
5
Ótimo plugin. Consulte Notepad ++ XmlTools Not Install para obter ajuda com a instalação.
precisa saber é
16
E com a versão 5.8.7, o próprio Plugin Manager do Notepad ++ ("Plugins / Plugin Manager") torna o processo de instalação automático.
Alimentado
1
@FranzEbner Eu tive esse mesmo problema. Se o XMLpróprio referenciar um XSDarquivo, por exemplo xsi:noNamespaceSchemaLocation="file.xsd", o XML Tools tentará usá-lo em vez de fornecer um diálogo "definido".
theblang
22

O xmlstarlet é uma ferramenta de linha de comando que fará isso e muito mais:

$ xmlstarlet val --help
XMLStarlet Toolkit: Validar documento (s) XML
Uso: xmlstarlet val <opções> [<xml-file-or-uri> ...]
onde <opções>
  -w ou - bem formado - valida apenas a boa formação (padrão)
  -d ou --dtd <dtd-file> - valida contra DTD
  -s ou --xsd <xsd-file> - valida contra o esquema XSD
  -E ou --embed - valida usando DTD incorporado
  -r ou --relaxng <rng-file> - valida contra o esquema Relax-NG
  -e ou --err - imprime mensagens de erro detalhadas no stderr
  -b ou --list-bad - lista apenas arquivos que não validam
  -g ou --list-good - lista apenas arquivos que validam
  -q ou --quiet - não lista arquivos (retorna apenas o código do resultado)

NOTA: Os esquemas XML ainda não são totalmente suportados devido ao seu incompleto
      suporte na libxml2 (consulte http://xmlsoft.org)

XMLStarlet é um kit de ferramentas de linha de comando para consultar / editar / verificar / transformar
Documentos XML (para mais informações, consulte http://xmlstar.sourceforge.net/)

O uso no seu caso seria na linha de:

xmlstarlet val --xsd your_schema.xsd your_file.xml
Charles Duffy
fonte
3
Você sabe o quão sério o aviso é sobre o suporte total aos esquemas xml?
Jason Dagit 24/09/08
2
A julgar por outras respostas, o xmlstarlet é um pouco fraco em sua implementação xsd.
Jason Dagit 24/09/08
3
Dado que o xmlstarlet apenas usa a libxml2 sob o capô, provavelmente é mais fácil usar o xmllint, que acompanha o libxml2 e é explicado na resposta aceita.
Adrian Mouat
@ JasonDagit, ... é exatamente tão fraco quanto o xmllint - eles usam a mesma implementação de biblioteca.
Charles Duffy
O modelo de conteúdo não é determinista. :-( #
Greg
16

Para Windows, existe o XML Notepad 2007 gratuito . Você pode selecionar XSDs para validar contra

UPDATE: melhor ainda, use o Notepad ++ com o plugin XML Tools

SteveC
fonte
3

Eu uso o Xerces:

http://xerces.apache.org/xerces-c/

John
fonte
1
Eles possuem uma linha de comando que pode ser usada em um console para verificar a validação de um arquivo XSLT no XSD do XSLT 2.0?
Alexis Wilke
Sim, você pode instalar uma ferramenta CLI sudo apt install libxerces-c-samplese verificar o documento com StdInParse -v=always -n -s < document.xml.
jgrocha 10/04
2

Estou apenas aprendendo o esquema. Estou usando o RELAX NG e usando o xmllint para validar. Estou ficando frustrado com os erros que saem do xmlllint. Eu gostaria que eles fossem um pouco mais informativos.

Se houver um atributo errado no XML, xmllint informa o nome do atributo não suportado. Mas se estiver faltando um atributo no XML, você receberá uma mensagem informando que o elemento não pode ser validado.

Estou trabalhando em um XML muito complicado com regras muito complicadas e sou novo nisso, portanto, rastrear qual atributo está faltando está demorando muito.

Atualização: Acabei de encontrar uma ferramenta java que estou gostando muito. Pode ser executado a partir da linha de comando, como xmllint, e suporta RELAX NG: https://msv.dev.java.net/

Pengo
fonte
2

Um editor XML para validação XML rápida e fácil está disponível em http://www.xml-buddy.com

Você só precisa executar o instalador e, depois disso, pode validar seus arquivos XML com um aplicativo de desktop fácil de usar ou com a linha de comando. Além disso, você também recebe suporte para Schematron e RelaxNG. A validação em lote também é suportada ...

Atualização 1/13/2012: A ferramenta de linha de comando é livre para usar e usa o Xerces como analisador XML.

Clemens
fonte
1

Uma ótima ferramenta visual para validar e gerar XSD a partir de XML é o IntelliJ IDEA, intuitivo e simples.

jacktrade
fonte
1

Você pode conectar seu esquema XML ao Intellisense do Microsoft Visual Studio. Essa opção fornece validação em tempo real E preenchimento automático, o que é incrível.

Eu tenho esse cenário exato em execução na minha cópia gratuita do Microsoft Visual C ++ 2010 Express.

AaronDanielson
fonte
0

Eu costumo usar o xsd da Microsoft para ajudar a gerar o xsd a partir de um arquivo .NET. Também analiso seções do xml usando xmlstarlet. A ferramenta gratuita final que seria útil para você é o altovaxml, disponível neste URL: http://www.altova.com/download_components.html .

Isso me permite verificar todos os arquivos xml, escolhendo qual xsd usar analisando o xml.

# Function:
#    verifyschemas - Will validate all xml files in a configuration directory against the schemas in the passed in directory
# Parameters:
#    The directory where the schema *.xsd files are located.  Must be using dos pathing like: VerifySchemas "c:\\XMLSchemas\\"
# Requirements:
#    Must be in the directory where the configuration files are located
#
verifyschemas()
{
    for FILENAME in $(find . -name '*.xml' -print0 | xargs -0)
    do
        local SchemaFile=$1$(getconfignamefromxml $FILENAME).xsd
        altovaxml /validate $FILENAME /schema $SchemaFile > ~/temp.txt 2> /dev/null
        if [ $? -ne 0 ]; then
            printf "Failed to verify: "
            cat ~/temp.txt | tail -1 | tr -d '\r'
            printf "    - $FILENAME with $SchemaFile\n"
        fi
    done
}

Para gerar o xml, uso: xsd DOTNET.dll / tipo: CFGCLASS & renomeie schema0.xsd CFGCLASS.xsd

Para obter o nome xsd, eu uso: xmlstarlet sel -t -m / XXX / * -v local-name () $ 1 | sed / $ // '

Isso permite que eu pegue o XSD correto usando uma tag de elemento no arquivo xml.

O resultado final é que posso chamar uma função bash para verificar todos os arquivos XML e verificá-los. Mesmo se eles estiverem em vários subdiretórios.

Andrew Stern
fonte