使用STAX API进行XML解析

问题描述:

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

开放街道地图结构具有元素如标签其描述为好节点,以及所述方式。这里是一个结构的例子:

 <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> 

如果分析器读取标签元素,我该如何区分节点和方式?

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

下面是与ArrayDeque一个例子...

假设stuff.xml命名这个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