Bonjour,

Je travaille actuellement sur un projet qui vise à extraire des données d'un fichier XML pour pouvoir les manipuler derrière.

Je me suis inspiré du tutoriel présent sur le site : http://cynober.developpez.com/tutoriel/java/xml/jdom/

Voici un extrait du fichier XML de façon à ce que vous puissiez comprendre la structure du 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
28
29
30
31
32
33
34
35
 
<?xml version="1.0" encoding="UTF-8"?>
<nvd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://nvd.nist.gov/download/nvdcve.xsd" nvd_xml_version="1.1" pub_date="2006-10-25">
 
<entry type="CVE" name="CVE-2006-0001" seq="2006-0001" discovered="2005-08-03" published="2006-09-12" modified="2006-09-13" severity="Medium" CVSS_score="5.6" CVSS_vector="(AV:R/AC:H/Au:NR/C:P/I:P/A:P/B:N)">
  <desc>
    <descript source="cve">Stack-based buffer overflow in Microsoft Publisher 2000 through 2003 allows user-assisted remote attackers to execute arbitrary code via a crafted PUB file, which causes an overflow when parsing fonts.</descript>
  </desc>
  <loss_types>
    <sec_prot other="1" />
  </loss_types>
  <vuln_types>
    <input buffer="1" />
  </vuln_types>
  <range>
    <local />
    <user_init />
  </range>
  <refs>
    <ref source="BUGTRAQ" url="http://www.securityfocus.com/archive/1/archive/1/445824/100/0/threaded" adv="1" patch="1">20060912 Computer Terrorism (UK) :: Incident Response Centre - Microsoft Publisher Font Parsing Vulnerability</ref>
  </refs>
  <vuln_soft>
    <prod name="Publisher" vendor="Microsoft">
      <vers num="2000" />
      <vers num="2002" />
      <vers num="2003" />
    </prod>
    <prod name="Office" vendor="Microsoft">
      <vers num="2000 SP3" />
      <vers num="XP SP3" />
      <vers num="2003 SP1" />
      <vers num="2003 SP2" />
    </prod>
  </vuln_soft>
</entry>
Sachant que mon fichier xml est gros puisqu'il fait environ 9 Mo, je ne vous mets cela que pour comprendre la structure du fichier. (http://nvd.nist.gov/download.cfm)

Bref, j'utilise un filtre JDOM pour pouvoir récupérer par exemple toutes les balises entry possédant comme balise fille, une balise vuln_soft ayant une elle-même une balise fille prod avec en attribut vendor = "Microsoft".

Voici le code correspondant :

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
    public static List appliquer_filtre(String nomFic)
    {
        java.lang.String s;
        Element el;
        java.util.List liste = null;
 
        try
        {
            f = new Filter()
            {
                public boolean matches(Object ob)
                {
                    boolean ret = false;
 
                    // On filtre l'OS
                    if (categ == 'o')
                    {
                        ret = filtre_os(ob);
                    }
 
                    // On filtre le produit
                    if (categ == 'p')
                    {
                        ret = filtre_produit(ob);
                    }
 
                    // On filtre la sévérité
                    if (categ == 's')
                    {
                        ret = filtre_severite(ob);
                    }
 
                    return ret;
                }
            };
 
            // Permet de parser le document XML
            sxb = new SAXBuilder();
 
            // Renvoie un objet de type Document
            doc = sxb.build(nomFic);
 
            // Renvoie l'élément racine du document
            Element root = doc.getRootElement();
            saved_root = doc.detachRootElement();
 
            // Renvoie une liste qui contient tous les noeuds "entry" de l'Element root
            liste = root.getContent(f);
        }
 
        catch (Exception e)
        {
            e.printStackTrace();
        }
 
        return liste;
    }
 
    public static boolean filtre_os(Object ob)
    {
        String os = ((Critere) Fenetre_ppale.tab_criteres.get(0)).getVal();
 
        Element elt_prod = new Element("test");
 
        // On vérifie que les objets sont bien des Elements
        if (!(ob instanceof Element))
        {
            return false;
        }
 
        Element element = (Element) ob;
 
        // On vérifie l'OS
        if (element.getChild("vuln_soft") != null)
        {
            elt_prod = element.getChild("vuln_soft").getChild("prod");
        }
 
        else
        {
            return false;
        }
 
        if ((elt_prod.getAttributeValue("vendor")).equals(os))
        {
            return true;
        }
 
        else
        {
            return false;
        }
    }
En fait, mon problème est que lorsque j'applique ce filtre, je ne récupère dans une liste qu'une partie des résultats apparemment.

Je dis apparemment parce que j'ai fait des tests avec XPath pour essayer de récupérer la même chose et il se trouve que j'ai beaucoup plus de résultats.

Donc voilà, si quelqu'un a une idée sur l'origine du problème, je suis tout ouïe

Merci d'avance pour votre aide