07. marts 2011 - 21:15
Der er
11 kommentarer og 1 løsning
Parsing af XML med SAX - klasse returnerer 'null'
Hej Eksperten, Jeg har et større problem i forbindelse med parsing af en XML-fil og "manupulering" af nodes værdier. Lavpraktisk har jeg en XML-fil med nogle tags (something.xml): ================================================= <?xml version="1.0" encoding="UTF-8"?> <data> <phrase id="1" value="something"/> <phrase id="2" value="different"/> </data> ================================================= min klasse ser således ud: ================================================= import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class Parser extends DefaultHandler{ private String id, value, something, different; private String xmlfile = "something.xml"; int index; public Parser(){ } public void parseDocument(){ try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); DefaultHandler handler = new Language(); parser.parse(xmlfile, handler); } catch (Exception e) { } } // start element public void startElement(String uri, String localName, String qname, Attributes atts) throws SAXException { if(qname.equals("phrase")){ id = atts.getValue("id"); value = atts.getValue("value"); } index = Integer.valueOf(id); } // end element public void endElement(String uri, String localName, String qname) throws SAXException{ doStuff(index, value); } // switch case manipulation public void doStuff(int i, String s){ switch(i){ case 1: setSomething(s); break; case 2: setDifferent(s); break; default: System.out.println("Oh noes!"); } } public void setSomething(String s){ something = s; } public void setDifferent(String s){ different = s; } public String getSomething(){ return something; } public String getDifferent(){ return different; } } ================================================= Testklassen: ================================================= public class ParserTest { public static void main(String[] args) { Parser p = new Parser(); p.parseDocument(); System.out.printf("%s %s", p.getSomething(), p.getSomething()); } } I stedet for at udskrive "something different", får jeg blot "null null". Hvis jeg mens xml-filen parses udskriver værdier er der ingen problemer. Det udskrives det rigtige... Nogle ideer til hvordan jeg kommer videre?
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
07. marts 2011 - 21:38
#1
Skulle: DefaultHandler handler = new Language(); parser.parse(xmlfile, handler); have vaeret: parser.parse(xmlfile, this); ?
07. marts 2011 - 21:39
#2
PS: medmindre din XML fil er meget stor, saa vil jeg nok anbefale DOM og XPath til at hive data ud med.
07. marts 2011 - 22:15
#3
Hov ja, det er sjusket copy / paste fra min side af. Det skulle have været DefaultHandler handler = new Parser(); parser.parse(xmlfile, handler); men man kunne også bare nøjes med at skrive parser.parse(xmlfile, this); Jeg har også kigget på DOM, men nu er jeg blevet stædig! Også fordi xml-filen kan gå hen og blive relativ stor (sprogfil i sidste ende)
07. marts 2011 - 22:31
#4
Alright, fejlen er fundet :) Udover at DefaultHandler handler = new Parser(); parser.parse(xmlfile, handler); skulle være parser.parse(xmlfile, this); skulle index = Integer.valueOf(id); én linje højere op... Hvis du kaster et svar får du point for hjælpen :)
07. marts 2011 - 22:34
#5
DefaultHandler handler = new Parser(); parser.parse(xmlfile, handler); duer ikke fordi du saa gemmer i et andet Parser objekt end det du henter fra. Brug: parser.parse(xmlfile, this);
07. marts 2011 - 22:34
#6
og naar du saa erstatter: catch (Exception e) { } med: catch (Exception e) { e.printStackTrace(); } kan du se hvor det gaar galt.
07. marts 2011 - 22:35
#7
public void startElement(String uri, String localName, String qname, Attributes atts) throws SAXException { if(qname.equals("phrase")){ id = atts.getValue("id"); value = atts.getValue("value"); } index = Integer.valueOf(id); // <------- skal flyttes ind i if !! }
07. marts 2011 - 22:35
#8
svar
07. marts 2011 - 22:36
#9
stor XML fil er stoerre end 10 MB !
07. marts 2011 - 22:38
#10
10mb rammer jeg næppe - men nu er jeg også blevet dét klogere på SAX :)
07. marts 2011 - 22:45
#11
Problemet med DOM er memory forbrug. Regn med at en XML fil indlaest i DOM fylder 4-5 gange saa meget som paa disk. 10 MB bliver til 40-50 MB i memory. Det er ikke noget problem paa idags computere. Og at hente ud med XPath er altsaa noget nemmere.
07. marts 2011 - 23:01
#12
Jeg har bestemt ikke tænkt mig kun at bruge SAX for fremtiden - bruger også DOM i andre sammenhænge. Men igen, jeg har lært lidt :)
Kurser inden for grundlæggende programmering