Bonjour

je ne n'arrive pas à trouver mon erreur dans ce code: il s'agit de calcul d'expressions mathématiques se trouvant dans un fichier xml.
PS: ça marche pour les expressions R1 et R3 mais pas pour R2.

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
 
 /**
 * @author barry
 *
 */
import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
 
public class ExpMath {
 
    private static double resultat = 0.0f;
    private static String expression = "";
	/**
         * Calcul d'expressions arithmétiques
         * contenues dans une feuille xml (exam.xml).
         */
	public static double evaluate(Element e, Element rac) {
		// TODO Auto-generated constructor stub
		double v;
 
		if (e == null){
			 v = resultat;
			 resultat = 0.0f;
			 return v;
		}
 
		else if (e.getTagName().equals("op"))
		{
			expression = expression + " (";
			Element child = (Element) e.getFirstChild();
			if (child.getTagName().equals("op"))
			   resultat = evaluate((Element) child.getFirstChild(), rac);
			else 
				resultat = evaluate(child, rac);
 
 
		}//op 
 
		else if (e.getTagName().equals("var"))
		{
			String varName = e.getAttribute("nom");
			double varValeur = 0.0f;
			char operateur;
			NodeList lesConstantes = rac.getElementsByTagName("const");
			for (int j = 0; j < lesConstantes.getLength(); j++)
			{
			  if (((Element) lesConstantes.item(j)).getAttribute("nom").equals(varName))
			       varValeur = Double.parseDouble(((Element) lesConstantes.item(j)).getAttribute("valeur"));
			}
			operateur = ((Element) e.getParentNode()).getAttribute("symbole").charAt(0);
			expression = expression + varValeur;
			if (e.getNextSibling() != null)
			  e = (Element) e.getNextSibling();
			else {
			  expression += ") ";
			  e = (Element) e.getParentNode().getNextSibling();
			  if (e != null) {
			    operateur = ((Element) e.getParentNode()).getAttribute("symbole").charAt(0);
//			  Addition
				if (operateur == '+')
				    resultat += evaluate((Element)e.getFirstChild(), rac);
 
				//Soustraction
				else if (operateur == '-')
					resultat -= evaluate((Element) e.getFirstChild(), rac);
 
				//Multiplication
				else if (operateur == '*')
					resultat *= evaluate((Element) e.getFirstChild(), rac);
 
				//Division
				else if (operateur == '/')
					resultat /= evaluate((Element)e.getFirstChild(), rac);
 
			  }
			}
 
			expression = expression + " " + operateur;
			//Addition
			if (operateur == '+')
			    resultat = varValeur + evaluate(e, rac);
 
			//Soustraction
			else if (operateur == '-')
				resultat = varValeur - evaluate(e, rac);
 
			//Multiplication
			else if (operateur == '*')
				resultat = varValeur * evaluate(e, rac);
 
			//Division
			else if (operateur == '/')
				resultat = varValeur / evaluate(e, rac);
 
			}//var
 
		    v = resultat;
		    resultat = 0.0f;
		    return v;
 
	}
 
	public static String getExpression(){
		String exp = expression;
		expression = "";
		return exp;
	}
 
	/**
         * @param args
         */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setCoalescing(false);
		dbf.setIgnoringElementContentWhitespace(true);
		dbf.setValidating(true);
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document document = db.parse(new File("/home/barry/Oxygen XML Editor 9/exam.xml"));
		// rac est l'élément racine du document.
		Element rac =  document.getDocumentElement();
		NodeList lesExp = rac.getElementsByTagName("exp");
		System.out.println("---------------------------------------------------");
		for (int i = 0; i < lesExp.getLength(); i++)
		{
			String n = ((Element) lesExp.item(i)).getAttribute("nom");
			Element ex = (Element) lesExp.item(i).getFirstChild();
			System.out.println(n + " = " + evaluate(ex, rac) + " = " + getExpression());
			System.out.println("---------------------------------------------------");
		}
 
	}//Main
 
}//ExpMath
CODE XML:
Code xml : 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
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE formules SYSTEM "file:/home/barry/Oxygen%20XML%20Editor%209/exam.dtd">
 
<formules>
    <constantes>
        <const valeur="3" nom="X"/>
        <const valeur="78" nom="Y"/>
        <const valeur="45" nom="Z"/>
    </constantes>
    <exps>
        <exp nom="R1">
            <op symbole="+">
                <var nom="X"/>
                <var nom="Z"/>
            </op>
        </exp>
        <exp nom="R2">
            <op symbole="+">
                <op symbole="*">
                    <var nom="X"/>
                    <var nom="X"/>
                </op>
                <op symbole="*">
                    <var nom="Y"/>
                    <var nom="Y"/>
                </op>
            </op>
        </exp>
        <exp nom="R3">
            <op symbole="*">
                <var nom="X"/>
                <op symbole="*">
                    <var nom="X"/>
                    <op symbole="*">
                        <var nom="X"/>
                        <op symbole="+">
                            <var nom="Y"/>
                            <var nom="Z"/>
                        </op>
                    </op>
                </op>
            </op>
        </exp>
    </exps>
</formules>


DTD:
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT formules (constantes, exps) >
<!ELEMENT constantes (const+) >
<!ELEMENT const EMPTY >
<!ATTLIST const valeur CDATA #REQUIRED nom ID #REQUIRED >
<!ELEMENT exps (exp*) >
<!ELEMENT exp (op) >
<!ATTLIST exp nom ID #REQUIRED >
<!ELEMENT op ((var, var+) | (op, op+) | (var, op+,var*) | (var*, op+, var)) >
<!ATTLIST op symbole CDATA #REQUIRED >
<!ELEMENT var EMPTY >
<!ATTLIST var nom IDREF #REQUIRED >