【问题标题】:XML Parsing with STAX API使用 STAX API 进行 XML 解析
【发布时间】:2013-11-01 09:28:58
【问题描述】:

我正在尝试使用 Stax 解析开放街道地图的 XML 结构。在我的实现中,我使用 XMLStreamConstants.START_ELEMENTXMLStreamConstants.END_ELEMENT 识别元素。

OpenStreetMaps 结构具有 tag 等元素,这些元素描述了 node 以及 way。下面是一个结构示例:

      <node id="2311741639" ... lat="50.7756648" lon="6.0844948">
       <tag k="entrance" v="yes"/>
      </node>
      <way id="4964449" visible="true" ... uid="67862">
       <nd ref="27290865"/>
        ...
       <tag k="highway" v="residential"/>
        ...
      </way>

如果解析器读取Tag-Element,如何区分节点和方式?

【问题讨论】:

    标签: java xml parsing openstreetmap stax


    【解决方案1】:

    您可以使用节点表示的ArrayDeque,如果层次结构的深度很小,甚至可以构建一个临时的类似 DOM 的结构。

    这是ArrayDeque的示例...

    假设这个 XML 文件名为 stuff.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <stuff>
    
    <node id="2311741639" lat="50.7756648" lon="6.0844948">
        <tag k="entrance" v="yes"/>
    </node>
    
    <way id="4964449" visible="true" uid="67862">
        <nd ref="27290865"/>
        <tag k="highway" v="residential"/>
    </way>
    
    </stuff>
    

    假设文件在路径上:/my/path/

    这里是代码(try/catch Java 6 风格):

    InputStream is = null;
    XMLStreamReader reader = null;
    try {
        is = new FileInputStream(new File("/my/path/stuff.xml"));
        XMLInputFactory xif = XMLInputFactory.newInstance();
        reader = xif.createXMLStreamReader(is);
        ArrayDeque<String> nodes = new ArrayDeque<String>();
        while (reader.hasNext()) {
            int current = reader.next();
            switch (current) {
                case XMLStreamConstants.START_ELEMENT: {
                    nodes.add(reader.getLocalName());
                    System.out.println("START: " + nodes.getLast());
                    if (nodes.size() > 1) {
                        Iterator<String> iterator = nodes.descendingIterator();
                        // skipping first one as it's already represented
                        iterator.next();
                        while (iterator.hasNext()) {
                            System.out.println("\t in " + iterator.next());
                        }
                    }
                    break;
                }
                case XMLStreamConstants.END_ELEMENT: {
                    System.out.println("END: " + nodes.removeLast());
                    Iterator<String> iterator = nodes.descendingIterator();
                    while (iterator.hasNext()) {
                        System.out.println("\t in " + iterator.next());
                    }
                    break;
                }
            }
        }
    
    }
            catch (FileNotFoundException fnfe) {
                fnfe.printStackTrace();
            }
            catch (XMLStreamException xse) {
                xse.printStackTrace();
            }
            finally {
                if (reader != null) {
                    try {
                        reader.close();
                        is.close();
                    }
                    catch (XMLStreamException xse) {
                        xse.printStackTrace();
                    }
                    catch (IOException ioe) {
                        ioe.printStackTrace();
                    }
                }
            }
    

    输出:

    START: stuff
    START: node
         in stuff
    START: tag
         in node
         in stuff
    END: tag
         in node
         in stuff
    END: node
         in stuff
    START: way
         in stuff
    START: nd
         in way
         in stuff
    END: nd
         in way
         in stuff
    START: tag
         in way
         in stuff
    END: tag
         in way
         in stuff
    END: way
         in stuff
    END: stuff
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-30
      • 2012-03-20
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 2012-04-11
      • 2016-01-13
      • 2011-08-24
      相关资源
      最近更新 更多