OSM xml сломан? - PullRequest
       8

OSM xml сломан?

0 голосов
/ 18 марта 2020

Я скачал карту мира OSM. При синтаксическом анализе я получаю исключение:

osm
bound
changeset
(...)
changeset
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 3682; columnNumber: 140; XML-Dokumentstrukturen müssen innerhalb derselben Entity beginnen und enden.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.endEntity(XMLDocumentFragmentScannerImpl.java:899)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.endEntity(XMLDocumentScannerImpl.java:559)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.endEntity(XMLEntityManager.java:1398)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1916)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(XMLEntityScanner.java:1187)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:987)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanAttribute(XMLDocumentFragmentScannerImpl.java:1548)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1315)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:195)
    at xxxx.web.OSMReader.main(OSMReader.java:20)

Мой код:

public class OSMReader {
    public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
        BZip2CompressorInputStream bic = new BZip2CompressorInputStream(new FileInputStream(new File("X:\\Medien\\Karten\\planet-200309.osm.bz2")));
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.newSAXParser().parse(bic, new DefaultHandler() {
            @Override
            public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                System.out.println(qName);
            }
        });
        bic.close();
    }
}

Я почти уверен, что OSM может генерировать файлы XML.

XML -Файл сам по себе слишком велик, чтобы подтвердить проблему.

Есть идеи, как успешно проанализировать XML?

РЕДАКТИРОВАТЬ

Я пытался прочитайте строки в xml:

public class OSMReader {
    public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
        BZip2CompressorInputStream bic = new BZip2CompressorInputStream(new FileInputStream(new File("X:\\Medien\\Karten\\planet-200309.osm.bz2")));
        BufferedReader br = new BufferedReader(new InputStreamReader(bic));
        int i = 0;
        while (i++ < 3685) {
            String line = br.readLine();
            if (i > 3680) {
                System.out.println(line);
            }
        }
        bic.close();
    }
}

Что дает мне этот вывод:

 <changeset id="3678" created_at="2008-06-01T01:18:46Z" closed_at="2008-06-01T02:47:15Z" open="false" user="mawis" uid="37850" min_lat="49.1950155" min_lon="9.2284944" max_lat="49.2049970" max_lon="9.2458586" num_changes="154" comments_count="0"/>
 <changeset id="3679" created_at="2007-04-01T11:30:20Z" closed_at="2007-04-01T12:30:24Z" open="false" user="B10xxx" uid="6454" min_lat="52.
null
null
null

Я проверил хэши MD5, и они совпадают:

X:\Medien\Karten>fciv -md5 planet-200309.osm.bz2
//
// File Checksum Integrity Verifier version 2.05.
//
4da6b47311c1b05f603542a55df2d69b planet-200309.osm.bz2

X:\Medien\Karten>

С содержанием https://planet.openstreetmap.org/planet/2020/planet-200309.osm.bz2.md5

1 Ответ

1 голос
/ 18 марта 2020

Мне пришлось добавить , true в конструктор BZip2CompressorInputStream.

...