# einzelne tags mit jdom auslesen



## gast_connie (16. Dez 2006)

hallo,

ich möchte, für ein kleines testprogramm, die testdaten aus einer xml-datei auslesen.  für die klasse PlusButton und die Methode operate also die 2 testfälle plus1 und plus2 mit den jeweilen testdaten <param>


```
<tests>
  <class name="PlusButton">
    <method name="operate">
      <test-case name="plus1">
        <params>
          <param name="var">10</param> 
          <param name="var">20</param> 
	  <param name="result">30</param> 
        </params>
      </test-case>
	<test-case name="plus2">
        <params>
          <param name="var">15</param> 
          <param name="var">9</param> 
          <param name="var">1</param> 
	  <param name="result">25</param> 
        </params>
      </test-case>
    </method>
  </class>
...
```

ich habe mit java und jdom nur wenig erfahrung.  ich möchte die tags "var" und "result" jeweils in ein array schreiben, die ich dann übergeben kann.  so in etwa habe ich mir das vorgestellt:


```
File datei = new File("C:/testen/workspace/TRechnerTest/testdata/test_data.xml");
		
	SAXBuilder builder = new SAXBuilder();
	Document document = builder.build(datei);
        
        Element root = document.getRootElement();
	           
        List test=root.getChild("class").getChild("method").getContent();
        
        Iterator t=test.iterator();
        String var[]=null;
        String res[]=null;
	    
	    while(t.hasNext())
	    {
	    	Element e = (Element) t.next();
	    	List tliste=root.getChild("class").getChild("method").getChild("test-case")
	    						.getChild("params").getChildren();
	    	
	    	Iterator tl=tliste.iterator();
	    	for(int j=0; j<tliste.size(); j++)
	    	{
                        //Initialisierung der beiden Arrays var und res fehlt noch

                        Element el=(Element) tl.next();
	    		if(el.getChild("param").getAttribute("name").getValue()=="var")
		    		//var[j]=el.getChild("param").getText();
	    			System.out.println("var "+el.getChild("param").getValue());
	    		else if(el.getChild("param").getAttribute("name").getValue()=="result")
		    		//res[j]=el.getChild("param").getText();
	    			System.out.println("result"+el.getChild("param").getValue());
	    		
	    	}    	
	    	
	    }
```

so funktioniert es nicht, ich bekomme den fehler  java.lang.ClassCastException.  hat jemand eine einfache lösung parat?  
vielen dank.


----------



## clemson (16. Dez 2006)

Hallo!

Ich würde dafür XPath verwenden. Am besten googelst mal danach...


```
package org.javaforum.y06.dec.tests;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

public class TestXPath
{

	/**
	 * @param args
	 * @throws IOException
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Exception
	{
		File testsFile = new File("tests.xml");
		SAXBuilder builder = new SAXBuilder();
		Document document = builder.build(testsFile);

		Element rootElement = document.getRootElement();
		String xpathQuery = "//tests/class[@name='PlusButton']/method/*";
		List<Element> list = XPath.selectNodes(rootElement, xpathQuery);

		for (Element testCaseElement : list)
		{
			// get the params element
			Element paramsElement = testCaseElement.getChild("params");

			// get all var params
			List<Element> varParamList = XPath.selectNodes(paramsElement, "//param[@name='var']");
			for (Element varParamElement : varParamList)
			{
				log("var-param:" + varParamElement.getText());
			}

			// get the result param
			Element resultParamElement = (Element) XPath.selectSingleNode(paramsElement, "//param[@name='result']");
			log("result: " + resultParamElement.getTextTrim());
			
			log("###############");
		}

	}

	private static void log(String text)
	{
		System.out.println(text);
	}

}
```


----------



## byte (16. Dez 2006)

Die java.lang.ClassCastException wird geworfen, weil getContent() nicht ausschließlich Objekte vom Typ Element liefert. Du musst also in der Schleife vor dem casten erstmal prüfen, ob das Objekte auch vom Typ Element ist.

Ansonsten ist der Tipp mit XPath ziemlich gut. Alternative: Über root.getDescendants() iterieren.


----------



## gast_connie (17. Dez 2006)

danke für die schnelle antwort.  hab es wie oben mit xpath probiert.  es funktioniert auch, allerdings werden die params folgendermaßen ausgegeben:

var-param:10
var-param:20
var-param:15
var-param:9
var-param:1
result: 30
###############
var-param:10
var-param:20
var-param:15
var-param:9
var-param:1
result: 30
###############

was muss ich in der for-schleife noch ändern, damit die params in der form

var
var
result
#######
var 
var
var
result
#######

ausgeben werden?


----------



## clemson (17. Dez 2006)

also dass nur die werte ausgegeben werden?

die werte werden in dem beispiel über die log methode ausgegeben. eine ausgabe sieht dan beispielsweise so aus:

```
log("var-param:" + varParamElement.getText());
```
willst du jetzt nur den text des xml tags ausgeben, so musst du

```
log(varParamElement.getText());
```
aufrufen...

alles klar? bzw. war das deine frage?


----------

