Lecture de début de balise pas toujours fait
salut
j'utilise Stax pour lire un fichier xml
Code:
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
| public class StaxParser implements ComponentParser {
private Map<String,ComponentParser> delegates;
public StaxParser() {
delegates = new HashMap<String,ComponentParser>();
}
public void parseElement(XMLStreamReader staxXmlReader) throws XMLStreamException {
for (int event = staxXmlReader.next(); event != XMLStreamConstants.END_DOCUMENT; event = staxXmlReader.next()) {
System.out.println(staxXmlReader.getLocalName() + " " + event);
if (event == XMLStreamConstants.START_ELEMENT) {
String element = staxXmlReader.getLocalName();
if (delegates.containsKey(element)) {
ComponentParser parser = delegates.get(element);
parser.parseElement(staxXmlReader);
}
}
}
}
public void registerParser(String name,ComponentParser parser) {
delegates.put(name,parser);
}
} |
Code:
1 2 3 4 5 6 7 8 9 10
| public class StaxUtil {
public static void moveReaderToElement(String target, XMLStreamReader reader) throws XMLStreamException {
for (int event = reader.next(); event != XMLStreamConstants.END_DOCUMENT; event = reader.next()) {
if ((event == XMLStreamConstants.START_ELEMENT) && (reader.getLocalName().equals(target))) {
return;
}
}
} |
Code:
1 2 3 4 5 6 7 8
| public class ProjectParser implements ComponentParser {
public void parseElement(XMLStreamReader staxXmlReader) throws XMLStreamException {
String name = staxXmlReader.getAttributeValue(0);
StaxUtil.moveReaderToElement("description", staxXmlReader);
String description = staxXmlReader.getElementText();
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class DataModelParser implements ComponentParser {
public void parseElement(XMLStreamReader staxXmlReader) throws XMLStreamException {
String name = staxXmlReader.getAttributeValue(0);
String type = staxXmlReader.getAttributeValue(1);
StaxUtil.moveReaderToElement("description", staxXmlReader);
String description = staxXmlReader.getElementText();
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11
| public class EntityParser implements ComponentParser{
public void parseElement(XMLStreamReader staxXmlReader) throws XMLStreamException {
StaxUtil.moveReaderToElement("name", staxXmlReader);
String name = staxXmlReader.getAttributeValue(0);
StaxUtil.moveReaderToElement("description", staxXmlReader);
String description = staxXmlReader.getElementText();
}
} |
ma classe pour tester le tout
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| InputStream in = new FileInputStream("C:\\test.xml");
XMLInputFactory factory = (XMLInputFactory) XMLInputFactory.newInstance();
XMLStreamReader staxXmlReader = (XMLStreamReader) factory.createXMLStreamReader(in);
StaxParser parser = new StaxParser();
parser.registerParser("project", new ProjectParser());
parser.registerParser("datamodel", new DataModelParser());
parser.registerParser("entity", new EntityParser());
parser.parseElement(staxXmlReader);
staxXmlReader.close();
in.close(); |
voici le fichier xml
Code:
1 2 3 4 5 6 7 8 9
| <?xml version="1.0"?>
<project name="a">
<datamodel name="ldm_test" type="ldm">
<description>description de ldm_test</description>
<entity name="test1">
<description>description de test1</description>
</entity>
</datamodel>
</project> |
j'ai donc définie un parser pour lire les éléments de project, datamodel et entity
j'arrive à lire les valeurs de project
datamodel n'est pas lu, il ne détecte pas que c'est le commencement d'une balise... je me demande bien pourquoi
ensuite entity est lu
une idée?