WedX - журнал о программировании и компьютерных науках

Обработка сжатых XML-документов с помощью dom4j

В частности, я использовал dom4j для чтения документов KML и анализа некоторых данных в XML. Когда я просто передаю URL-адрес в виде строки читателю, это так просто и обрабатывает как URL-адреса файловой системы, так и веб-URL-адреса:

SAXReader reader = new SAXReader();
Document document = reader.read(url);

Проблема в том, что иногда мой код должен обрабатывать документы KMZ, которые в основном представляют собой просто заархивированные документы XML (KML). К сожалению, нет удобного способа справиться с этим с помощью SAXReader. Я нашел всевозможные причудливые решения для определения того, является ли тот или иной файл ZIP-файлом, но мой код быстро становится раздутым и неприятным — чтение потока, создание файла, проверка «магических» шестнадцатеричных байтов в начале, извлечение и др.

Есть ли какой-нибудь быстрый и чистый способ справиться с этим? Более простой способ подключиться к любому URL-адресу и извлечь содержимое, если оно сжато, иначе просто взять XML?

15.01.2013

Ответы:


1

Хм, похоже, KMZDOMLoader не обрабатывает файлы kmz в Интернете. Возможно, kmz загружается динамически, поэтому он не всегда будет иметь а) ссылку на файл или б) специальное расширение .kmz — он должен будет определяться по типу содержимого.

В итоге я создал объект URL, а затем получил протокол. У меня есть отдельная логика для обработки локального файла или документа в Интернете. Затем внутри каждого из этих логических блоков я должен был определить, сжат ли он. Метод read() SAXReader принимает входной поток, поэтому я обнаружил, что могу использовать ZipInputStream для kmz.

Вот код, который у меня получился:

private static final long ZIP_MAGIC_NUMBERS = 0x504B0304;
private static final String KMZ_CONTENT_TYPE = "application/vnd.google-earth.kmz";

private Document getDocument(String urlString) throws IOException, DocumentException, URISyntaxException {
        InputStream inputStream = null;
        URL url = new URL(urlString);
        String protocol = url.getProtocol();

        /*
         * Figure out how to get the XML from the URL -- there are 4 possibilities:
         * 
         * 1)  a KML (uncompressed) doc on the filesystem
         * 2)  a KMZ (compressed) doc on the filesystem
         * 3)  a KML (uncompressed) doc on the web
         * 4)  a KMZ (compressed) doc on the web
         */
        if (protocol.equalsIgnoreCase("file")) {
            // the provided input URL points to a file on a file system
            File file = new File(url.toURI());
            RandomAccessFile raf = new RandomAccessFile(file, "r");
            long n = raf.readInt();
            raf.close();

            if (n == KmlMetadataExtractorAdaptor.ZIP_MAGIC_NUMBERS) {
                // the file is a KMZ file
                inputStream = new ZipInputStream(new FileInputStream(file));
                ((ZipInputStream) inputStream).getNextEntry();
            } else {
                // the file is a KML file
                inputStream = new FileInputStream(file);
            }

        } else if (protocol.equalsIgnoreCase("http") || protocol.equalsIgnoreCase("https")) {
            // the provided input URL points to a web location
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            String contentType = connection.getContentType();

            if (contentType.contains(KmlMetadataExtractorAdaptor.KMZ_CONTENT_TYPE)) {
                // the target resource is KMZ
                inputStream = new ZipInputStream(connection.getInputStream());
                ((ZipInputStream) inputStream).getNextEntry();
            } else {
                // the target resource is KML
                inputStream = connection.getInputStream();
            }

        }

        Document document = new SAXReader().read(inputStream);
        inputStream.close();

        return document;
    }
16.01.2013
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]