Validando um arquivo XML



  • Olá pessoal,

    estou recebendo um determinado arquivo XML e preciso fazer a validação através de um arquivo XSD, no Maker possui nativamente tais funções necessárias ou preciso fazer essa implementação?

    Alguém poderia me ajudar?


  • Acho que existe uma função chamada "Validar Schema XML"


  • Não contém essa função e nenhuma com nome parecido na categoria "XML", não pelo menos no Maker 2.6, a não ser que exista numa versão mais nova.

    Caso alguém tenha, por favor me enviei ou ajude como posso fazer isso.


  • Realmente, Maker 2.6 não sei se tem não... Veja as API's mais novas se tem e importa...
    Lembro que tinha essa função por ai em algum lugar.
    Se quiser mais precisão, entra em contato com o suporte.


  • Onde encontro o download das API's?

    Faz dias que tento falar com o suporte e não me dão retorno.


  • Veja com o suporte. Não tenho links aqui.


  • Vou tentar.

    Caso alguém tenha, por favor, me enviei!


  • Consegui importar a função, mas agora estou com problema de usa-lá.

    Na pasta "C:\teste\" tenho os arquivos "teste.xml" e "teste.xsd".

    Na descrição da função "XML - Validar Schema", descreve que no 1º parâmetro envio o XML e no 2º parâmetro o XSD, ambos como letras.

    Esses parâmetros do tipo letras, seria o conteúdo contido nos arquivos ou o caminho?

    Fiz o teste utilizando as duas maneiras mencionadas acima, ambas retornou "false" para validação. Qual maneira correta?


  • Conteúdo do XML


  • E o XSD?

    Tentei utilizar enviando o conteúdo, mas veja bem, o arquivo XSD possui outros include, como ficaria nesse caso?


  • Conteúdo também.

    Não sei como ficaria. Acredito que pode não funcionar a validação. Olhando o código da função, a validação ocorre a partir do padrão W3C de schema:

    javax.xml.validation.SchemaFactory factory = javax.xml.validation.SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);


    Caso não sirva para o seu caso, você talvez terá que implementar outra forma.

    T+


  • Saeger,

    implementei uma função de acordo com a minha necessidade, envio pra essa função os caminhos do XML e do XSD.

    Acontece que criei ela no Eclipse para teste e depois adaptei no Maker. O problema é que está demorando demais para executar.

    No Eclipse a função retorna o valor instantaneamente, já no Maker ocorre uma certa demora de aproximadamente 20 segundos.

    O que pode ser?

    Função criada no Eclipse:
    [code] protected final static boolean validate(String xmlFullFileName, String xsdFullFileName) { try { javax.xml.parsers.DocumentBuilderFactory documentBuilderFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); documentBuilderFactory.setValidating(true); documentBuilderFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); documentBuilderFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", xsdFullFileName); javax.xml.parsers.DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); org.w3c.dom.Document document = null; document = documentBuilder.parse(xmlFullFileName); javax.xml.validation.SchemaFactory schemaFactory = javax.xml.validation.SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); javax.xml.transform.Source schemaFile = new javax.xml.transform.stream.StreamSource(new File(xsdFullFileName)); javax.xml.validation.Schema schema = schemaFactory.newSchema(schemaFile); javax.xml.validation.Validator validator = schema.newValidator(); validator.validate(new javax.xml.transform.dom.DOMSource(document)); return true; } catch (Exception e) { return false; } } [/code]
    Função criada no Maker:
    [code] protected final Variant osXMLValidar(Variant caminhoXML, Variant caminhoXSD) { String xmlFullFileName = caminhoXML.getString(); String xsdFullFileName = caminhoXSD.getString(); try { javax.xml.parsers.DocumentBuilderFactory documentBuilderFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); documentBuilderFactory.setValidating(true); documentBuilderFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); documentBuilderFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", xsdFullFileName); javax.xml.parsers.DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); org.w3c.dom.Document document = null; document = documentBuilder.parse(xmlFullFileName); javax.xml.validation.SchemaFactory schemaFactory = javax.xml.validation.SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); javax.xml.transform.Source schemaFile = new javax.xml.transform.stream.StreamSource(new File(xsdFullFileName)); javax.xml.validation.Schema schema = schemaFactory.newSchema(schemaFile); javax.xml.validation.Validator validator = schema.newValidator(); validator.validate(new javax.xml.transform.dom.DOMSource(document)); return Variant.VARIANT_TRUE; } catch (Exception e) { return Variant.VARIANT_FALSE; } } [/code]


  • Me passa um XML e um XSD


  • Enviado em anexo uma pasta "arq", dentro dela contem a pasta "xml" e a pasta "xsd".

    Caminho XML
    arq/xml/35131202316749000178550010000025041130009957-procNFe.xml

    Caminho XSD
    arq/xsd/procNFe_v2.00.xsd
    [154_arq.rar](/assets/uploads/files/154_arq.rar)


  • Fiz no eclipse e aqui demorou. Quase 1 minuto.

    Output abaixo:
    [code] Fri Apr 25 16:29:44 ART 2014 true Fri Apr 25 16:30:40 ART 2014 [/code]


  • Ué, muito estranho porque olha o meu:

    Fri Apr 25 16:38:05 BRT 2014
    true
    Fri Apr 25 16:38:05 BRT 2014

    Abaixo a chamada da função testada:
    [code] public static void main(String[] args) throws Throwable { System.out.println(new Date()); String xml = "C:/Program Files/Softwell Solutions/Maker 2.6/Webrun 2/tomcat/webapps/webrun2_7_0_44/arquivos/nfe/entrada/tmp/35131202316749000178550010000025041130009957-procNFe.xml"; String xsd = "C:/Program Files/Softwell Solutions/Maker 2.6/Webrun 2/tomcat/webapps/webrun2_7_0_44/arquivos/nfe/xsd/2.00/procNFe_v2.00.xsd"; System.out.println(Validar.validate(xml, xsd)); System.out.println(new Date()); } [/code]


  • Executei pra mostrar os milissegundos e olha que é muito rápido a verificação.

    1398455202165
    true
    1398455202520


  • Alguém mais poderia estar testando essa função no Eclipse com os arquivos enviados a alguns comentários atrás?


  • Pessoal, passei a função e os arquivos para outras pessoas e todos me disseram que está normal no Eclipse, funcionando direitinho.

    Alguém poderia me ajudar a fazer essa validação no Maker?

    Não é possível que ninguém fez. :(

Log in to reply