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