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
Post a Comment