• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Tim Cooke
  • paul wheaton
  • Liutauras Vilda
  • Ron McLeod
Sheriffs:
  • Jeanne Boyarsky
  • Devaka Cooray
  • Paul Clapham
Saloon Keepers:
  • Scott Selikoff
  • Tim Holloway
  • Piet Souris
  • Mikalai Zaikin
  • Frits Walraven
Bartenders:
  • Stephan van Hulst
  • Carey Brown

Why does the SAXParser give the different result ?

 
Greenhorn
Posts: 17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I use NetBeans to create the simple SAX code to parse the Train.xml below :

<?xml version="1.0" encoding="UTF-8"?>
<train xmlns:myPrefix="http://example.com">
<car type="Engine">
<color>Black</color>
<weight>512 tons</weight>
<length>60 feet</length>
<occupants>3</occupants>
</car>
<car type="Baggage">
<color>Green</color>
<weight>80 tons</weight>
<length>40 feet</length>
<occupants>0</occupants>
</car>
<car type="Dining">
<color>Green and Yellow</color>
<weight>50 tons</weight>
<length>50 feet</length>
<occupants>18</occupants>
</car>
<car type="Passenger">
<color>Green and Yellow </color>
<weight>40 tons</weight>
<length>60 feet</length>
<occupants>23</occupants>
</car>
<car type="Pullman">
<color>Green and Yellow</color>
<weight>50 tons</weight>
<length>60 feet</length>
<occupants>23</occupants>
</car>
<car type="Caboose">
<color>Red</color>
<weight>90 tons</weight>
<length>30 feet</length>
<occupants>4</occupants>
</car>
</train>


import java.io.File;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class TrainReader extends DefaultHandler{

private boolean isColor;
private String trainCarType = "";
private StringBuffer trainCarColor = new StringBuffer();

/** Creates a new instance of TrainReader */
public TrainReader() {
}

public static void main(String[] args)throws Exception{
System.out.println("Running train reader...");
TrainReader readerObj = new TrainReader();
readerObj.read(args[0]);
}

public void read(String fileName)throws Exception{
//Code 1
SAXParserFactory spfactory = SAXParserFactory.newInstance();
SAXParser saxParser = spfactory.newSAXParser();
spfactory.setValidating(true);
spfactory.setNamespaceAware(true);
saxParser.parse(new File(fileName),this);

//Code 2
//XMLReader reader = XMLReaderFactory.createXMLReader();
//reader.setContentHandler(this);
//reader.parse(fileName);
}

public void startDocument() throws SAXException{
System.out.println("Start of the train");
}

public void endDocument() throws SAXException{
System.out.println("End of the train");
}

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

if (localName.equals("car")){
if (attributes != null){
trainCarType = attributes.getValue("type");
}
}

if (localName.equals("color")){
trainCarColor.setLength(0);
isColor = true;
}else{
isColor = false;
}

}

public void characters(char[] ch, int start, int length) throws SAXException {
if(isColor){
trainCarColor.append(ch,start,length);
}
}

public void endElement(String uri, String localName, String qName) throws SAXException {
if(isColor){
System.out.println("The color of the " + trainCarType + " car is" +
trainCarColor.toString());
}
isColor = false;
}

public void startPrefixMapping(String prefix, String uri) throws SAXException {
System.out.println("Start of Prefix Mapping");
System.out.println("The prefix is " + prefix);
System.out.println("The uri is " + uri);
}

public void endPrefixMapping(String prefix) throws SAXException {
System.out.println("End of Prefix Mapping");
System.out.println("The prefix is " + prefix);
}
}

The problem is why it give different result between Code 1 and Code 2 in read(String fileName) method.

When use code 1, the result is :
Running train reader...
Start of the train
End of the train


When use code 2, the result is :
Running train reader...
Start of the train
Start of Prefix Mapping
The prefix is myPrefix
The uri is http://example.com
The color of the Engine car isBlack
The color of the Baggage car isGreen
The color of the Dining car isGreen and Yellow
The color of the Passenger car isGreen and Yellow
The color of the Pullman car isGreen and Yellow
The color of the Caboose car isRed
End of Prefix Mapping
The prefix is myPrefix
End of the train

In code 1, the localName is always blank. I try to change the below value in all combination- true-true, true-false,flase-flase, flase-true.
spfactory.setValidating(true);
spfactory.setNamespaceAware(true);
 
Ranch Hand
Posts: 2023
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Try this way:
 
Politics n. Poly "many" + ticks "blood sucking insects". Tiny ad:
Gift giving made easy with the permaculture playing cards
https://coderanch.com/t/777758/Gift-giving-easy-permaculture-playing
reply
    Bookmark Topic Watch Topic
  • New Topic