Bonjour,

Je dois créer un composant permettant de vérifier des requêtes XPath dans un fichier XML packagé dans un jar.

Ma conception fut la suivante, à partir d'un JarInputStream:
  1. Positionnement du flux sur la JarEntry pointant le XML escompté
  2. Création d'une InputSource à partir du JarInputStream
  3. Application des requêtes XPath sur l'InputSource


... sauf que les résultats des requêtes appliquées sont faux. Une modification de conception en construisant un Document Dom (nourri par le même JarInputStream) donne des résultats exacts.

Un gourou traînant par ici, aurait-il une explication?

Ce qui ne fonctionne pas:
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
 
 
		JarInputStream jis = new JarInputStream(is);
 
		// positionnement
		JarEntry current;
		do {
			current = jis.getNextJarEntry();
		} while (current != null && !JBOSSESB_XML.equals(current.getName()));
 
		try {
			XPath xpath = XPathFactory.newInstance().newXPath();
 
			// Retourne systématiquement 0 node, faux!
			NodeList nodes = (NodeList) xpath.evaluate("<my Xpath>", 
					new InputSource(jis),
					XPathConstants.NODESET);
			[...]
		} catch (XPathExpressionException e) {
			e.printStackTrace();
			throw new IngestRepositoryException(e);
		}finally{
			jis.close();
		}
Ce qui fonctionne:
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
28
29
30
31
32
 
		JarInputStream jis = new JarInputStream(is);
 
		// positionnement
		JarEntry current;
		do {
			current = jis.getNextJarEntry();
		} while (current != null && !JBOSSESB_XML.equals(current.getName()));
 
		DocumentBuilder docBuilder;
		Document doc;
		try {
			docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			doc = docBuilder.parse(jis);
 
			XPath xpath = XPathFactory.newInstance().newXPath();
 
			// Retourne le résultat attendu
			NodeList nodes = (NodeList) xpath.evaluate("<my Xpath>", 
					doc,
					XPathConstants.NODESET);
			[...]
 
		} catch (ParserConfigurationException e) {
			[...]
		} catch (SAXException e) {
			[...]
		} catch (XPathExpressionException e) {
			[...]
		}finally{
			jis.close();
		}