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();
    }
}
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();
    }
}
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
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 : 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'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?