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:
- Positionnement du flux sur la JarEntry pointant le XML escompté
- Création d'une InputSource à partir du JarInputStream
- 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:
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 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(); }
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(); }
Partager