2017-02-23 201 views
1

我有一個很大的XML文件,我需要從它解析幾個元素。如何在使用Stax解析器時定義* start *和* end *標籤?

<root> 
    <head> 
     <version>1.1</version> 
    </head> 
    <body> 
     <ele1>value</ele1> 
     <ele2> 
      <suvEle1>value</suvEle1> 
     </ele2> 
     <ele3> 
      <suvEle1>value</suvEle1> 
     </ele3> 
    </body> 
</root> 

我想讀取<body>中的所有元素。但是 - 除了<body>標記 - <body>內的所有其他標記都是動態的。如何定義開始結束使用Stax解析器時的標記?

回答

0

您可以使用XMLStreamConstants.START_ELEMENTXMLStreamConstants.END_ELEMENT來確定開始和結束標記。像下面這樣。

import java.io.StringReader; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamConstants; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.XMLStreamReader; 

public static void testStaxParser() { 
     String xmlSource = "<root>" + 
         "<head>" + 
          "<version>1.1</version>" + 
         "</head>" + 
         "<body>" + 
          "<ele1>value</ele1>" + 
          "<ele2>" + 
           "<suvEle1>value</suvEle1>" + 
          "</ele2>" + 
          "<ele3>" + 
           "<suvEle1>value</suvEle1>" + 
          "</ele3>" + 
         "</body>" + 
        "</root>";  

     try { 
      XMLInputFactory factory = XMLInputFactory.newInstance(); 
      XMLStreamReader reader = 
       factory.createXMLStreamReader(
         new StringReader(xmlSource)); 

      while(reader.hasNext()){ 
       int parseEvent = reader.next(); 

       if (parseEvent == XMLStreamConstants.START_ELEMENT){ 
        if ("body".equals(reader.getLocalName())) { 
         System.out.println("Start of body element."); 
         processElements(reader); 
         return; 
        } 
       } 
      } 
     } 
     catch (Exception e){ 
      e.printStackTrace(System.err); 
     } 

    } 

public static void processElements(XMLStreamReader reader) throws XMLStreamException { 
     do { 
      int parseEvent = reader.next(); 

      switch(parseEvent){ 
       case XMLStreamConstants.START_ELEMENT: 
        System.out.println("Start of element " + reader.getLocalName());     
        break; 

       case XMLStreamConstants.CHARACTERS: 
        System.out.println("Element content is " + reader.getText().trim()); 

        break; 

       case XMLStreamConstants.END_ELEMENT: 
        if ("body".equals(reader.getLocalName())) { 
         System.out.println("End of body element."); 
         return; 
        } 

        System.out.println("End of element " + reader.getLocalName()); 
        break; 
      }   
     } while (reader.hasNext()); 
    }