1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| public class InfoHandler extends DefaultHandler {
private InfoList infoList;
private final Deque<Node> stack = new ArrayDeque<>();
private static class Node {
private final StringBuilder sb = new StringBuilder();
private final DataType dataType;
private final Map<DataType,Object> fields = new EnumMap(DataType.class);
private Node(String name) {
this.dataType = DataType.ofName(name);
}
public <T> T getData(DataType type) {
return (T)fields.get(type);
}
public String getStringValue() {
return sb.toString();
}
}
public InfoHandler(InfoList infoList) {
this.infoList = infoList;
}
// indique à l'intérieur de quelle balise on se trouve
private enum DataType {
TITRE("titre"),
TEXTE("texte"),
DATEFIN("datefin"),
INFO("info"),
NONE(""),
;
private final String name;
private DataType(String name) {
this.name=name;
}
public static DataType ofName(String name) {
for(DataType type : DataType.values()) {
if ( name.equals(type.name) ) {
return type;
}
}
return DataType.NONE;
}
}
@Override
public void startElement(String uri, String localName, String rawName, Attributes atts) {
System.out.println("Début de la balise : "+rawName);
stack.push(new Node(rawName));
}
@Override
public void characters(char [] ch, int start, int length){
stack.peek().sb.append(ch, start, start+length);
}
@Override
public void endElement(String uri, String localName, String rawName) {
System.out.println("Fin de la balise : "+rawName);
Node node = stack.pop();
switch(node.dataType) {
case TITRE:
case TEXTE:
stack.peek().fields.put(node.dataType, node.getStringValue());
break;
case DATEFIN:
stack.peek().fields.put(node.dataType, new Date(Long.parseLong(node.getStringValue())));
break;
case INFO:
infoList.addInfo(new Info (node.getData(DataType.TITRE), node.getData(DataType.TEXTE), node.getData(DataType.DATEFIN)));
break;
default:
// nothing
}
}
} |
Partager