salut
j'utilise Stax pour lire un fichier xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } }ma classe pour tester le tout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } }
voici le fichier xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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();
j'ai donc définie un parser pour lire les éléments de project, datamodel et entity
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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'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?
Partager