Estou gerando alguns arquivos xml que precisam estar em conformidade com um arquivo xsd que me foi fornecido. Qual é a melhor maneira de verificar se estão em conformidade?
fonte
Estou gerando alguns arquivos xml que precisam estar em conformidade com um arquivo xsd que me foi fornecido. Qual é a melhor maneira de verificar se estão em conformidade?
A biblioteca de tempo de execução Java suporta validação. A última vez que verifiquei isso foi o analisador Apache Xerces, embaixo das cobertas. Você provavelmente deve usar um javax.xml.validation.Validator .
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd:
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(xmlFile);
System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}
A constante de fábrica do esquema é a cadeia http://www.w3.org/2001/XMLSchema
que define os XSDs. O código acima valida um descritor de implementação WAR com relação ao URL, http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
mas você pode validar facilmente com um arquivo local.
Você não deve usar o DOMParser para validar um documento (a menos que seu objetivo seja criar um modelo de objeto de documento). Isso começará a criar objetos DOM à medida que analisa o documento - desperdício se você não for usá-los.
Veja como fazer isso usando o Xerces2 . Um tutorial para isso, aqui (req. Inscrição).
Atribuição original: descaradamente copiada daqui :
fonte
Construímos nosso projeto usando ant, para que possamos usar a tarefa schemavalidate para verificar nossos arquivos de configuração:
Agora arquivos de configuração impertinentes falharão em nossa compilação!
http://ant.apache.org/manual/Tasks/schemavalidate.html
fonte
Como essa é uma pergunta popular, apontarei que o java também pode validar contra xsd "referidos", por exemplo, se o próprio arquivo .xml especificar XSDs no cabeçalho, usando
xsi:SchemaLocation
ouxsi:noNamespaceSchemaLocation
(ou xsi para namespaces específicos) ex :ou SchemaLocation (sempre uma lista de namespace para mapeamentos xsd)
As outras respostas funcionam aqui também, porque os arquivos .xsd "mapeiam" para os espaços de nomes declarados no arquivo .xml, porque eles declaram um espaço para nome e, se corresponder ao espaço para nome no arquivo .xml, você estará bem. Mas às vezes é conveniente poder ter um resolvedor personalizado ...
Nos javadocs: "Se você criar um esquema sem especificar uma URL, arquivo ou fonte, a linguagem Java criará uma que procure no documento que está sendo validado para encontrar o esquema que ele deve usar. Por exemplo:"
e isso funciona para vários namespaces, etc. O problema dessa abordagem é que
xmlsns:xsi
provavelmente é um local de rede, portanto, por padrão, ele sai e atinge a rede com toda e qualquer validação, nem sempre ideal.Aqui está um exemplo que valida um arquivo XML com relação a quaisquer XSDs que ele faz referência (mesmo que precise retirá-los da rede):
Você pode evitar extrair XSDs referenciados da rede, mesmo que os arquivos xml façam referência a URLs, especificando o xsd manualmente (veja algumas outras respostas aqui) ou usando um resolvedor de estilo "Catálogo XML" . Aparentemente, o Spring também pode interceptar as solicitações de URL para servir arquivos locais para validações. Ou você pode definir o seu próprio via setResourceResolver , ex:
Veja também aqui para outro tutorial.
Eu acredito que o padrão é usar a análise DOM, você pode fazer algo semelhante com o analisador SAX que está validando também
saxReader.setEntityResolver(your_resolver_here);
fonte
setResourceResolver
mas além disso, talvez aberta nova pergunta ...Usando o Java 7, você pode seguir a documentação fornecida na descrição do pacote .
fonte
parser.parse(new File("instance.xml"))
. Avalidator
aceita umSource
, para que você possa:validator.validate(new StreamSource(new File("instance.xml")))
.ErrorHandler
se você precisar fazer a validação.Se você possui uma máquina Linux, pode usar a ferramenta de linha de comando gratuita SAXCount. Achei isso muito útil.
Valida contra dtd e xsd. 5s para um arquivo de 50 MB.
No debian squeeze está localizado no pacote "libxerces-c-samples".
A definição de dtd e xsd deve estar no xml! Você não pode configurá-los separadamente.
fonte
xmllint --schema phone.xsd phone.xml
(a partir de uma resposta por 13ren)Mais uma resposta: como você disse que precisa validar os arquivos que está gerando (escrevendo), convém validar o conteúdo enquanto estiver escrevendo, em vez de escrever primeiro, e depois ler novamente para validação. Provavelmente, você pode fazer isso com a validação da API do JDK para Xml, se usar o gravador baseado em SAX: nesse caso, basta vincular o validador chamando 'Validator.validate (source, result)', onde a origem vem do seu gravador e o resultado é onde a saída precisa ir.
Como alternativa, se você usa o Stax para escrever conteúdo (ou uma biblioteca que usa ou pode usar stax), o Woodstox também pode suportar diretamente a validação ao usar o XMLStreamWriter. Aqui está uma entrada de blog mostrando como isso é feito:
fonte
Se você estiver gerando arquivos XML programaticamente, convém consultar a biblioteca XMLBeans . Usando uma ferramenta de linha de comando, o XMLBeans irá gerar e empacotar automaticamente um conjunto de objetos Java com base em um XSD. Você pode usar esses objetos para criar um documento XML com base neste esquema.
Possui suporte interno para validação de esquema e pode converter objetos Java em um documento XML e vice-versa.
O Castor e o JAXB são outras bibliotecas Java que servem a um propósito semelhante ao XMLBeans.
fonte
Com o JAXB, você pode usar o código abaixo:
fonte
Você está procurando uma ferramenta ou uma biblioteca?
No que diz respeito às bibliotecas, praticamente o padrão de fato é o Xerces2, que possui as versões C ++ e Java .
Esteja avisado, porém, é uma solução de peso pesado. Mas, novamente, validar XML contra arquivos XSD é um problema bastante pesado.
Quanto a uma ferramenta para fazer isso por você, o XMLFox parece ser uma solução freeware decente, mas não tendo usado pessoalmente, não posso dizer com certeza.
fonte
Validar contra esquemas online
Validar contra esquemas locais
Validação XML offline com Java
fonte
Usando o Woodstox , configure o analisador StAX para validar seu esquema e analisar o XML.
Se exceções forem capturadas, o XML não é válido, caso contrário, é válido:
Nota : Se você precisar validar vários arquivos, tente reutilizar seu
XMLInputFactory
eXMLValidationSchema
para maximizar o desempenho.fonte
Eu tive que validar um XML contra XSD apenas uma vez, então tentei o XMLFox. Eu achei muito confuso e estranho. As instruções de ajuda não pareciam corresponder à interface.
Acabei usando o LiquidXML Studio 2008 (v6), que era muito mais fácil de usar e mais familiarizado imediatamente (a interface do usuário é muito semelhante ao Visual Basic 2008 Express, que eu uso frequentemente). A desvantagem: o recurso de validação não está na versão gratuita, então tive que usar o teste de 30 dias.
fonte