2015-07-10 74 views
0

的多個變量的值我有這個輸入XML:Java的SAX解析的DefaultHandler get標記與具有相同名稱

<REQUEST> 
    <ELEMENT>element inside request</ELEMENT> 
    <NUMBER>250</NUMBER> 
    <LIST> 
      <ELEMENT>element inside list</ELEMENT> 
      <LETTER>A</LETTER> 
    </LIST> 
    <OTHER1>other 1</OTHER1> 
</REQUEST> 
我在,我用它來獲取值的一類擴展的DefaultHandler

這是我的課:

public class MyHandler extends DefaultHandler { 
    private String elementName = null; 
    private boolean bElement = false; 

    private String element = null; 

    @Override 
    public void characters(char[] ch, int start, int length) throws SAXException { 
     if (bElement){ 
      elementName = new String(ch, start, length); 
     } 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 
     if("ELEMENT".equalsIgnoreCase(qName) && elementName == null){ 
      element = elementName; 
     } 
     bElement = false; 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
     if(qName.equalsIgnoreCase("ELEMENT")){ 
      bElement = true; 
     } 
    } 

    public String getElement() { 
     return this.element; 
    } 

} 

而且我有這樣的邏輯,以獲得元素值(請求是HttpServletRequest的):

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] buf = new byte[1024]; 
int n = 0; 
while ((n = request.getInputStream().read(buf)) >= 0) { 
    baos.write(buf, 0, n); 
} 
byte[] content = baos.toByteArray(); 
SAXParserFactory factory = SAXParserFactory.newInstance(); 
SAXParser saxParser = factory.newSAXParser(); 
MyHandler handler = new MyHandler(); 
saxParser.parse(new ByteArrayInputStream(content), handler); 
return handler.getElement(); 

當我把上面的XML,我們得到的REQUEST-> LIST-> ELEMENT,所以我得到字符串:

元素裏面名單

但我想第一標籤內要求

元素中的字符串

我需要完成MyHandler的類的代碼得到什麼ELEMENT內部值請求 - >元素並且沒有得到另一個ELEMENT

回答

0

您需要跟蹤XML中的完整位置。

NB - 這是完全未經測試的代碼。

public class MyHandler extends DefaultHandler { 

    // Use a DEQUE to track the current position inthe xml. 
    private Deque<String> position = new ArrayDeque<>(); 
    // My data. 
    private StringBuilder data = new StringBuilder(); 

    private String element = null; 

    @Override 
    public void characters(char[] ch, int start, int length) throws SAXException { 
     if (match()) { 
      // Append to my buffer. 
      data.append(ch, start, length); 
     } 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 
     // Ending a tag - pop it from end. 
     position.removeLast(); 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
     // Starting a tag - push it at the end. 
     position.addLast(qName); 
    } 

    public String getElement() { 
     return this.element; 
    } 

    // Specifically looking for the REQUEST.ELEMENT - not the REQUEST.LIST.ELEMENT 
    private final String[] lookingFor = {"REQUEST", "ELEMENT"}; 

    private boolean match() { 
     // Must be that deep. 
     if (position.size() == lookingFor.length) { 
      // Must match. 
      Iterator<String> match = position.iterator(); 
      for (int i = 0; i < lookingFor.length; i++) { 
       // Match? 
       if (!match.next().equals(lookingFor[i])) { 
        return false; 
       } 
      } 
     } else { 
      // Wrong depth. 
      return false; 
     } 
     // No mismatch -> match! 
     return true; 
    } 

} 

而且 - 順便說一句,你應該總是追加characters被調用。

相關問題