Hallo,
ich habe folgende XML- Datei, welche ich mit dem unteren Programm einlese,
ich möchte aber jetzt nicht nur "Amsterdam - 44" einlesen sondern mehr Städte, nur wenn ich noch einen "<procName>" dazugebe, erhalte ich folgenden Fehler:
line: 20file: null msg: The content of element type "procCall" must match "(procName,params)".
weiß jemand was ich da falsch mache?
Vielen Dank,
ich habe folgende XML- Datei, welche ich mit dem unteren Programm einlese,
ich möchte aber jetzt nicht nur "Amsterdam - 44" einlesen sondern mehr Städte, nur wenn ich noch einen "<procName>" dazugebe, erhalte ich folgenden Fehler:
line: 20file: null msg: The content of element type "procCall" must match "(procName,params)".
weiß jemand was ich da falsch mache?
Vielen Dank,
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE procCall SYSTEM "file:...">
<procCall>
<procName>Amsterdam</procName>
<params>
<param>
<value>
<int>44</int>
</value>
</param>
</params>
</procCall>
Code:
import org.xml.sax.helpers.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import java.io.*;
import java.util.Arrays;
public class SaxParser extends DefaultHandler implements ISaxParser{
private static final String PROCNAME;
private static final String VALUE;
private static final String VALEX;
private String dtdUri;
private String dtdFile;
private String currentElement;
private String file;
private String procName;
private String dataType;
private String data;
private boolean isDTD;
private boolean paramNext;
static {
PROCNAME = "procName";
VALUE = "value";
VALEX = "valEx";
}
public SaxParser(String file) {
this.isDTD = true;
this.file = file;
}
@Override
public void startElement(String uri, String name, String qname, Attributes atts) throws SAXException {
if(name.equalsIgnoreCase(PROCNAME))
currentElement = PROCNAME;
if(name.equalsIgnoreCase(VALUE)){
paramNext=true;
return;
}
if(paramNext) {
this.dataType = name;
currentElement=name;
}
}
@Override
public void endElement(String uri, String name, String qname)throws SAXException{
currentElement=null;
}
@Override
public void characters(char[] ch, int start, int end) throws SAXException {
if(currentElement == null)
return;
if(currentElement.equalsIgnoreCase(PROCNAME)) {
procName = new String(ch,start,end);
System.out.println("Ausgabe: \n\n" + Arrays.toString(ch) + "\n");
}
if(currentElement.equalsIgnoreCase(dataType)) {
data = new String(ch,start,end);
}
if(paramNext) {
paramNext = false;
}
}
@Override
public InputSource resolveEntity(String publicId, String systemId) { /*Entity Resolver */
if(dtdUri.equals(systemId)){
InputStream dtdStream= getClass().getResourceAsStream(dtdFile);
return new InputSource(dtdStream);
}
return null;
}
public void read() {
try {
SAXParserFactory fact= SAXParserFactory.newInstance();
SAXParser parser = fact.newSAXParser();
XMLReader xmlreader= parser.getXMLReader();
xmlreader.setContentHandler(this);
xmlreader.setErrorHandler(new SaxErrorHandler());
if(isDTD) {
try{
xmlreader.setFeature("http://xml.org/sax/features/validation", true);
xmlreader.setFeature("http://xml.org/sax/features/namespaces", true);
}
catch(SAXNotRecognizedException e){
System.out.println(VALEX);
}
}
FileReader fr= new FileReader(file);
xmlreader.parse(new InputSource(fr));
}
catch(Exception ex){
System.out.println("Exception in read: " + ex);
System.out.println(ex.getMessage());
}
}
public String getProcName()throws SAXException{
return this.procName;
}
public String getDataType()throws SAXException{
return this.dataType;
}
public String getData()throws SAXException{
return this.data;
}
public static void main(String args[])throws Exception{
SaxParser saxParser = new SaxParser(System.getProperty("user.dir") + "/XMLFiles/procCall.xml");
saxParser.read();
System.out.println("procName: " + ": " + saxParser.getProcName());
System.out.println("data type: " + saxParser.getDataType());
System.out.println("data content: " + saxParser.getData());
}
}