Java SAX DefaultHandler parsing get tag value with several tags with the same name -


i have input xml:

<request>     <element>element inside request</element>     <number>250</number>     <list>           <element>element inside list</element>           <letter>a</letter>     </list>     <other1>other 1</other1> </request> 

i'm extending defaulthandler in class use values.

this class:

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

and have logic element value (request 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(); 

when send xml above, value inside request->list->element, string:

element inside list

but want string inside first element tag

element inside request

what need complete code in myhandler class element value inside request->element , no other element.

you need keep track of full position in xml.

nb - untested code.

public class myhandler extends defaulthandler {      // use deque track current position inthe xml.     private deque<string> position = new arraydeque<>();     // 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 buffer.             data.append(ch, start, length);         }     }      @override     public void endelement(string uri, string localname, string qname) throws saxexception {         // ending tag - pop end.         position.removelast();     }      @override     public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception {         // starting tag - push @ end.         position.addlast(qname);     }      public string getelement() {         return this.element;     }      // looking request.element - not request.list.element     private final string[] lookingfor = {"request", "element"};      private boolean match() {         // must deep.         if (position.size() == lookingfor.length) {             // must match.             iterator<string> match = position.iterator();             (int = 0; < lookingfor.length; i++) {                 // match?                 if (!match.next().equals(lookingfor[i])) {                     return false;                 }             }         } else {             // wrong depth.             return false;         }         // no mismatch -> match!         return true;     }  } 

also - aside, should append when characters called.


Comments