5 votes

télécharger le XSD avec toutes les importations

J'utilise les XSD gml (3.1.1) dans les XSD pour mon application. Je veux télécharger tous les XSD gml en version 3.1.1 dans un fichier zip par exemple. En d'autres termes : le xsd de base est aquí et je veux télécharger ce XSD avec toutes les importations dans un fichier zip ou quelque chose comme un fichier zip. Existe-t-il une application qui supporte cela ? J'ai trouvé ceci téléchargeur mais cela ne fonctionne pas pour moi (je pense que cette application ne supporte pas les chemins relatifs dans les importations, ce qui se produit dans gml.xsd 3.1.1). Une idée ?

5voto

Petru Gardea Points 13264

QTAssistant XSR (auquel je suis associé) possède une fonction facile à utiliser qui permet d'importer et de remanier automatiquement le contenu XSD sous forme de fichiers locaux provenant de toutes sortes de sources. Au cours du processus, il met à jour les références de localisation des schémas, etc.

J'ai fait un simple capture d'écran des étapes de la réalisation d'une telle tâche, ce qui devrait démontrer sa facilité d'utilisation.

4voto

mfalaize Points 290

En me basant sur la solution de mschwehl, j'ai fait une classe améliorée pour réaliser le fetch. Elle convient bien à la question. Voir https://github.com/mfalaize/schema-fetcher

3voto

Raj Points 381

Vous pouvez y parvenir en utilisant l'interface utilisateur SOAP.

Suivez les étapes suivantes :

  1. Créez un projet en utilisant le WSDL.
  2. Choisissez votre interface et ouvrez-la dans le visualiseur d'interface.
  3. Naviguez vers l'onglet 'WSDL Content'.
  4. Utilisez la dernière icône sous l'onglet 'WSDL Content' : 'Export the entire WSDL and included/imported files to a local directory'.
  5. sélectionnez le dossier dans lequel vous souhaitez que les XSD soient exportés.

Remarque : SOAPUI supprimera tous les chemins relatifs et enregistrera tous les XSD dans le même dossier.

2voto

mschwehl Points 21

J'ai écrit un simple java-main qui fait le travail et change les url relatives.

package dl;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class SchemaPersister {

    private static final String EXPORT_FILESYSTEM_ROOT = "C:/export/xsd";

    // some caching of the http-responses
    private static Map<String,String> _httpContentCache = new HashMap<String,String>();

    public static void main(String[] args) {
        try {
            new SchemaPersister().doIt();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void doIt() throws Exception {

//      // if you need an inouse-Proxy
//      final String authUser = "xxxxx";
//      final String authPassword = "xxxx"
//
//      System.setProperty("http.proxyHost", "xxxxx");
//      System.setProperty("http.proxyPort", "xxxx");
//      System.setProperty("http.proxyUser", authUser);
//      System.setProperty("http.proxyPassword", authPassword);
//
//      Authenticator.setDefault(
//        new Authenticator() {
//          public PasswordAuthentication getPasswordAuthentication() {
//            return new PasswordAuthentication(authUser, authPassword.toCharArray());
//          }
//        }
//      );
//      

        Set <SchemaElement> allElements = new HashSet<SchemaElement>() ;

//      URL url = new URL("file:/C:/xauslaender-nachrichten-administration.xsd");
        URL url = new URL("http://www.osci.de/xauslaender141/xauslaender-nachrichten-bamf-abh.xsd");

        allElements.add ( new  SchemaElement(url));

        for (SchemaElement e: allElements) {

            System.out.println("processing " + e);
            e.doAll();
        }

        System.out.println("done!");

    }

    class SchemaElement {

        private URL    _url;
        private String _content;

        public List <SchemaElement> _imports ;
        public List <SchemaElement> _includes ;

        public SchemaElement(URL url) {
            this._url = url;
        }

        public void checkIncludesAndImportsRecursive() throws Exception {

            InputStream in = new ByteArrayInputStream(downloadContent() .getBytes("UTF-8"));

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            Document   doc = builder.parse(in);
            List<Node> includeNodeList = null;
            List<Node> importNodeList  = null;

            includeNodeList = getXpathAttribute(doc,"/*[local-name()='schema']/*[local-name()='include']");
            _includes = new ArrayList <SchemaElement> ();

            for ( Node element: includeNodeList) {

                Node sl = element.getAttributes().getNamedItem("schemaLocation");
                if (sl == null) {
                    System.out.println(_url + " defines one import but no schemaLocation");
                    continue;
                }

                String asStringAttribute = sl.getNodeValue();

                URL url = buildUrl(asStringAttribute,_url);

                SchemaElement tmp = new SchemaElement(url);
                tmp.setSchemaLocation(asStringAttribute);

                tmp.checkIncludesAndImportsRecursive();
                _includes.add(tmp);

            }

            importNodeList =  getXpathAttribute(doc,"/*[local-name()='schema']/*[local-name()='import']");
            _imports = new ArrayList <SchemaElement> ();

            for ( Node element: importNodeList) {

                Node sl = element.getAttributes().getNamedItem("schemaLocation");
                if (sl == null) {
                    System.out.println(_url + " defines one import but no schemaLocation");
                    continue;
                }

                String asStringAttribute = sl.getNodeValue();
                URL url = buildUrl(asStringAttribute,_url);

                SchemaElement tmp = new SchemaElement(url);
                tmp.setSchemaLocation(asStringAttribute);

                tmp.checkIncludesAndImportsRecursive();

                _imports.add(tmp);
            }

            in.close();

        }   

        private String schemaLocation;

        private void setSchemaLocation(String schemaLocation) {
            this.schemaLocation = schemaLocation;

        }

        // http://stackoverflow.com/questions/10159186/how-to-get-parent-url-in-java
        private URL buildUrl(String asStringAttribute, URL parent) throws Exception {

            if (asStringAttribute.startsWith("http")) {
                return new URL(asStringAttribute);
            }

            if (asStringAttribute.startsWith("file")) {
                return new URL(asStringAttribute);
            }

            // relative URL
            URI parentUri = parent.toURI().getPath().endsWith("/") ? parent.toURI().resolve("..") : parent.toURI().resolve(".");
            return new URL(parentUri.toURL().toString() + asStringAttribute );

        }

        public void doAll() throws Exception {

            System.out.println("READ ELEMENTS");
            checkIncludesAndImportsRecursive();

            System.out.println("PRINTING DEPENDENCYS");
            printRecursive(0);

            System.out.println("GENERATE OUTPUT");

            patchAndPersistRecursive(0);

        }

        public void patchAndPersistRecursive(int level) throws Exception {

            File f = new File(EXPORT_FILESYSTEM_ROOT + File.separator + this.getXDSName()  );

            System.out.println("FILENAME: " + f.getAbsolutePath());

            if (_imports.size() > 0) {

                for (int i = 0; i < level; i++) {
                    System.out.print("   ");
                }

                System.out.println("IMPORTS");
                for (SchemaElement kid : _imports) {
                    kid.patchAndPersistRecursive(level+1);
                }

            }

            if (_includes.size() > 0) {

                for (int i = 0; i < level; i++) {
                    System.out.print("   ");
                }

                System.out.println("INCLUDES");
                for (SchemaElement kid : _includes) {
                    kid.patchAndPersistRecursive(level+1);
                }

            }

            String contentTemp = downloadContent();

            for (SchemaElement i : _imports ) {

                if (i.isHTTP()) {
                    contentTemp = contentTemp.replace(
                            "<xs:import schemaLocation=\"" + i.getSchemaLocation() ,        
                            "<xs:import schemaLocation=\"" + i.getXDSName() );
                }

            }

            for (SchemaElement i : _includes ) {

                if (i.isHTTP()) {
                    contentTemp = contentTemp.replace(
                            "<xs:include schemaLocation=\"" + i.getSchemaLocation(),        
                            "<xs:include schemaLocation=\"" + i.getXDSName() );
                }

            }

            FileOutputStream fos = new FileOutputStream(f);     
            fos.write(contentTemp.getBytes("UTF-8"));
            fos.close();

            System.out.println("File written: " + f.getAbsolutePath() );

        }

        public void printRecursive(int level) {

            for (int i = 0; i < level; i++) {
                System.out.print("   ");
            }

            System.out.println(_url.toString());

            if (this._imports.size() > 0) {

                for (int i = 0; i < level; i++) {
                    System.out.print("   ");
                }

                System.out.println("IMPORTS");
                for (SchemaElement kid : this._imports) {
                    kid.printRecursive(level+1);
                }

            }

            if (this._includes.size() > 0) {

                for (int i = 0; i < level; i++) {
                    System.out.print("   ");
                }

                System.out.println("INCLUDES");
                for (SchemaElement kid : this._includes) {
                    kid.printRecursive(level+1);
                }

            }
        }

        String getSchemaLocation() {
            return schemaLocation;
        }

        /**
         * removes html:// and replaces / with _
         * @return
         */

        private String getXDSName() {

            String tmp = schemaLocation;

            // Root on local File-System -- just grap the last part of it
            if (tmp == null) {
                tmp = _url.toString().replaceFirst(".*/([^/?]+).*", "$1");
            }

            if ( isHTTP() ) {

                tmp = tmp.replace("http://", "");
                tmp = tmp.replace("/", "_");

            } else {

                tmp = tmp.replace("/", "_");
                tmp = tmp.replace("\\", "_");

            }

            return tmp;

        }

        private boolean isHTTP() {
            return _url.getProtocol().startsWith("http");
        }

        private String downloadContent() throws Exception {

            if (_content == null) {

                System.out.println("reading content from " + _url.toString());

                if (_httpContentCache.containsKey(_url.toString())) {
                    this._content = _httpContentCache.get(_url.toString());
                    System.out.println("Cache hit! " + _url.toString());
                } else {

                    System.out.println("Download " + _url.toString());
                    Scanner scan =  new Scanner(_url.openStream(), "UTF-8");

                    if (isHTTP()) {
                        this._content = scan.useDelimiter("\\A").next();    
                    } else {
                        this._content = scan.useDelimiter("\\Z").next();
                    }

                    scan.close();

                    if (this._content != null) {
                        _httpContentCache.put(_url.toString(), this._content);
                    }

                }

            }

            if (_content == null) {
                throw new NullPointerException("Content of " + _url.toString() + "is null ");
            }

            return _content;

        }

        private List<Node> getXpathAttribute(Document doc, String path) throws Exception {

            List <Node> returnList = new ArrayList <Node> ();

            XPathFactory xPathfactory = XPathFactory.newInstance();

            XPath xpath = xPathfactory.newXPath();

            {
                XPathExpression expr = xpath.compile(path);

                NodeList nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET );

                for (int i = 0 ; i < nodeList.getLength(); i++) {

                    Node n = nodeList.item(i);

                    returnList.add(n);

                }
            }

            return returnList;

        }

        @Override
        public String toString() {

            if (_url != null) {
                return _url.toString();
            }

            return super.toString();

        }

    }

}

1voto

n-a-t-e Points 51

J'ai créé un outil python pour télécharger de manière récursive les XSD avec des chemins relatifs en import (ex : <import schemaLocation="../../../../abc )

https://github.com/n-a-t-e/xsd_download

Après avoir téléchargé le schéma, vous pouvez utiliser xmllint pour valider un document XML

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X