# xpath mit jdom



## clemson (27. Jan 2005)

hallo!

ich habe folgendes problem:

ich möchte aus einer XML datei mittels einer XPath Abfrage und JDOM, Elemente heraus holen...

XML-Datei:

```
<METS:mets xmlns:METS="http://www.loc.gov/METS/">
    <dmdSec ID="DCMD_ELEC">
        <mdWrap MIMETYPE="text/xml" MDTYPE="DC">
            <xmldata>
                <dc:creator xmlns:dc="http://purl.org/dc/elements/1.0/">Bovet, Theodor</dc:creator>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Von Mann zu Mann</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Reifezeit</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Vom Werden des Menschen</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Vom mÃ¤nnlichen Charakter</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Von Meisterung und VerdrÃ¤ngung</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Von den MÃ¤dchen</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Klare Sicht</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Nachkommenschaft</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Was man auch noch wissen muss</dc:title>
                <dc:title xmlns:dc="http://purl.org/dc/elements/1.0/">Freiheit</dc:title>
            </xmldata>
        </mdWrap>
    </dmdSec>
</mets>
```

meine klasse MetsObject:

```
import java.io.*;
import java.io.IOException;

import java.util.List;

import org.jdom.*;
import org.jdom.xpath.*;
import org.jdom.input.*;
import org.jdom.output.*;

import org.xml.sax.SAXParseException;

import org.jaxen.jdom.JDOMXPath;

public class MetsObject
{

public static Document document;

public void parse (String path)
	{
		try {
			SAXBuilder saxbuilder = new SAXBuilder();
			saxbuilder.setIgnoringElementContentWhitespace(false);
			saxbuilder.setValidation(false);
			saxbuilder.setReuseParser(false);
			
	    	document = saxbuilder.build(new File(path));
	    	
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

public Object[] get_GRP( String abfrage )
	{
		try
			{
				
				XPath x = XPath.newInstance( abfrage );
				
							
		         	List ls = x.selectNodes( document );
				
				
                                if ( ls.isEmpty() | (ls.size()==0) )
				{
					return null;				
				}
				else
				{				
					return (Object[]) ls.toArray();
				}
			}
			catch (JDOMException ex)
			{
				ex.getMessage();					
				return null;
			}
			catch (ArrayIndexOutOfBoundsException ex)
			{
				ex.printStackTrace();					
				return null;
			}
						
		}
		else
		{
			return null;
		}
	}

}
```


und meine testklasse

```
public class testklasse
{
        public static void main(String[] args)
         {
			String query = new String("//dmdSec[@ID='DCMD_ELEC']/mdWrap/xmldata/node()/text()");
			
                       MetsObject mo = new MetsObject();
			
			mo.parse("C:\mets.xml");
        
			Object[] ob = new Object[mo.get_GRP( query ).length];

			ob = mo.get_GRP( query );

			System.out.println( ob[0].toString() );



			

          }
}
```


Normalerweise sollte er "Bovet, Theodor" ausgeben.

tut er aber nicht, er gibt stattdessen "[Text: Bovet, Theodor]" aus!!

wie komme ich auf den wert "Bovet, Theodor".

ich habe schon bei jdom.org-Documentation nachgeschlagen, und ich glaube die Lösung liegt bei einem org.jdom.filter.ContentFilter ....

könnt ihr mir weiterhelfen???


----------



## Roar (27. Jan 2005)

hmm gib mal auf der konsole: ob[0].getClass().getName() aus. ich nehme an da sind org.jdom.Text's in dem Object array gespeichert. versuche mal das ob[0] in ein Text objekt zu casten. dann kannst du mit getText() an "Bovet, Theodor" rankommen


----------



## clemson (28. Jan 2005)

ja, das wars.

jetzt funktioniert es endlich.


----------

