2013-11-15 47 views
2

我想在解析此XML內容時識別標記。我們有像isStartElement()或isEndElement()這樣的方法。但這不屬於這兩類。請幫助我。如何解決這種標籤。如何使用statx解析器識別空的xml標記

代碼:

import java.io.StringReader; 
import java.util.Hashtable; 
import java.util.Iterator; 

import javax.xml.stream.Location; 
import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamReader; 
import javax.xml.stream.events.EndElement; 
import javax.xml.stream.events.StartElement; 
import javax.xml.stream.events.XMLEvent; 

public class Sample { 

public static void main(String[] args) { 
    String xPath = "HAI/ONE";  
    String xml = "<HAI><ONE/></HAI>"; 
    try { 
     System.out.println(getValueByXPath(xml,xPath)); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 




}  
public String getValueByXPath(String xmlString, String xPathString){ 
    String value = ""; 
    String tagName = null; 
    int index = 2; 
    int hashIndex = 1; 
    int tagBalance = 0; 
    String tagIndex = null; 
    String[] tagIndexArr = null; 
    Hashtable<Integer,String> xPathHashtable = null; 

    XMLInputFactory xmlInputFactory; 
    XMLEventReader xmlEventReader; 
    try{    
     xmlInputFactory = XMLInputFactory.newInstance(); 
     xmlInputFactory.setProperty 
      (XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,Boolean.TRUE);  
     xmlInputFactory.setProperty 
      (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,Boolean.FALSE); 
     xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, 
      Boolean.FALSE); 
     xmlEventReader = xmlInputFactory.createXMLEventReader(new StringReader 
      (xmlString)); 

     //Split XPath 
     xPathHashtable = splitXPath(xPathString); 

     tagIndex = xPathHashtable.get(hashIndex); 
     tagIndexArr = tagIndex.split("="); 
     tagName = tagIndexArr[0]; 
     index = Integer.parseInt(tagIndexArr[1])+1; 

     while (xmlEventReader.hasNext()) { 
      XMLEvent e = xmlEventReader.nextEvent(); 

      if(tagBalance < 0){ 
       return ""; 
      } 

      if(index==1 && e.isCharacters()){ 
       value = e.asCharacters().getData(); 
       hashIndex++; 
       tagIndex = xPathHashtable.get(hashIndex); 
       if(tagIndex == null)break; 
       tagIndexArr = tagIndex.split("="); 
       tagName = tagIndexArr[0]; 
       index = Integer.parseInt(tagIndexArr[1])+1; 
       tagBalance = 0; 
       System.out.println(tagName+"tag"+index); 

      } 
      if (e.isStartElement()) {     
       StartElement startElement = e.asStartElement(); 
       if(tagName.equalsIgnoreCase(startElement.getName 
               ().getLocalPart())){ 
        index--; 
        tagBalance++; 
       } 
      } 

      if (e.isEndElement()) { 

       EndElement endElement = e.asEndElement(); 

       if(tagName.equalsIgnoreCase(endElement.getName 
               ().getLocalPart())){      
        tagBalance--; 
             } 
      } 
     } 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return value; 
} 

public Hashtable<Integer,String> splitXPath(String xPath){ 

    Hashtable<Integer,String> xPathHashtable = null; 
    String[] xPathSplit = null; 
    int hashIndex = 0; 

    int index = 1; 
    String tag= null; 
    try{ 
     xPathHashtable = new Hashtable<Integer,String>(); 
     xPathSplit = xPath.split("[\\[\\]/]"); 

     for(int i=0;i<xPathSplit.length;i++){ 

      if(xPathSplit[i].isEmpty()) continue; 

      try{ 
       index = Integer.parseInt(xPathSplit[i]); 
      }catch(Exception e){ 
       tag = xPathSplit[i]; 
       index = 1; 
       hashIndex++; 
      } 
      xPathHashtable.put(hashIndex, tag+"="+index);    
     } 

    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

    return xPathHashtable; 
} 
} 

我模擬情景的XPath使用StAX解析器。

回答

0

我遇到同樣的問題,無法在任何地方找到解決方案。

你想要做的是使用

xmlEventReader.peek().isEndElement() 

和處理,但是你會喜歡。 peek()不會像.nextEvent()那樣移動元素。