XPATH Tags auslesen ?

Hallo Zusammen,

ich möchte gerne eine Bean (POJO) mit den Werten aus dem XML-File befüllen.

PHP:
<?xml version="1.0" encoding="UTF-8"?>
<a>
	<b>
		<c>(c)</c>
		<d>
			<e>
				<g>(g1)</g>
				<h>(h1)</h>
			</e>
			<f>
				<g>(g2)</g>
				<h>(h2)</h>
			</f>
		</d>
		<i>(i)</i>
		<j>(j)</j>
		<k>(k)</k>
		<l>(l)</l>
		<m>(m)</m>
		<n>(n)</n>
	</b>
</a>

HTML:
MyBean myBean = new MyBean();
myBean.setC(Wert aus dem <c></c> Tag);
myBean.setK(Wert aus dem <k></k> Tag);

Mein Problem besteh darin, per XPATH an die einzelnen Elemente ran zu kommen.

Die Folgende Klasse kann zum Beispiel den Wert aus dem <c>(c)</c> Tag auslesen.

HTML:
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XPATHCoin {
	
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
		
		DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
		domFactory.setNamespaceAware(true);
		DocumentBuilder builder = domFactory.newDocumentBuilder();
		Document doc = builder.parse("myXMLFile.xml");

		XPathFactory factory = XPathFactory.newInstance();
		XPath xpath = factory.newXPath();
		
		XPathExpression expr = xpath.compile("//a/b/c/text()");
		
		Object result = expr.evaluate(doc, XPathConstants.NODESET);
		
		NodeList nodes = (NodeList) result;

		for (int i = 0; i < nodes.getLength(); i++) {
			System.out.println(nodes.item(i).getNodeValue());;
		}	
	}
	
}
Was muss ich machen, um alle Werte der XML Datei zu erhalten ?

HTML:
XPathExpression expr = xpath.compile("//a/*");
XPathExpression expr = xpath.compile("//a/node()");

Habe mit diesen Möglichkeiten gespielt. Finde jedoch bis jetzt keine Lösung :/

Bin für jede Hilfe dankbar!
 
Zuletzt bearbeitet:
So ganz verstehe ich Dein Problem nicht. Willst Du nur die Textknoten in Deine Bean schreiben? Was ist mit e und f. Soll das in Listen? Willst Du per Reflection die Setter ermitteln und in einer Schleife die Werte reinschreiben, oder willst Du sie Setter einzeln gezielt aufrufen. das wäre simple.

Java:
import java.io.IOException;
import java.io.Serializable;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class XPATHCoin {
	
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
		
		DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
		domFactory.setNamespaceAware(true);
		DocumentBuilder builder = domFactory.newDocumentBuilder();
		Document doc = builder.parse("myXMLFile.xml");

		XPathFactory factory = XPathFactory.newInstance();
		XPath xpath = factory.newXPath();
		
		MyBean myBean = new MyBean();
		XPathExpression expr = xpath.compile("//c");
		
		myBean.setC( ((Element) expr.evaluate(doc, XPathConstants.NODE)).getTextContent());
		
		expr = xpath.compile("//k");
		myBean.setK( ((Element) expr.evaluate(doc, XPathConstants.NODE)).getTextContent());
		
		System.out.println(myBean);
		
	}
	static class MyBean implements Serializable {
		 
		 private String c;
		 private String k;
		 
		
		 public MyBean() {
		 
			 this("","");
		 }
		 


		public MyBean(String c, String k) {
			setC(c);
			setK(k);
		}



		public String getC() {
			return c;
		}


		public void setC(String c) {
			this.c = c;
		}


		public String getK() {
			return k;
		}


		public void setK(String k) {
			this.k = k;
		}
		
		public String toString() {
			return "c=" + getC() +", k=" +getK();
		}
	 }
}

Hier mal ne Lösung mit ein bißchen Reflection...

Java:
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Method;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class XPATHCoin {
	
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
		
		DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
		domFactory.setNamespaceAware(true);
		DocumentBuilder builder = domFactory.newDocumentBuilder();
		Document doc = builder.parse("myXMLFile.xml");
		MyBean myBean = new MyBean();
		
		XPathFactory factory = XPathFactory.newInstance();
		XPath xpath = factory.newXPath();
		
		XPathExpression expr = xpath.compile("//*");

		NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
		
		

		for (int i = 0; i < nodes.getLength(); i++) {
			Element element = (Element) nodes.item(i);
			fillElementInBean(myBean, element);
		}	

		System.out.println(myBean);
	}
	private static void fillElementInBean(MyBean myBean, Element element) {
		
		try {
			Method method = myBean.getClass().getMethod("set" + element.getLocalName().toUpperCase(), new Class[] {String.class});
			method.invoke(myBean, new Object[]{element.getTextContent()});
		} catch (Exception e) {
			
			// System.out.println("Methode set" + element.getLocalName().toUpperCase() + " nicht gefunden!");;
		} 
	}
	static class MyBean implements Serializable {
		 
		 private String c;
		 private String k;
		 
		
		 public MyBean() {
		 
			 this("","");
		 }
		 


		public MyBean(String c, String k) {
			setC(c);
			setK(k);
		}



		public String getC() {
			return c;
		}


		public void setC(String c) {
			this.c = c;
		}


		public String getK() {
			return k;
		}


		public void setK(String k) {
			this.k = k;
		}
		
		public String toString() {
			return "c=" + getC() +", k=" +getK();
		}
	 }
}

Hier noch eine Lösung mit SAX. Scheint mir besser geignet als XPATH..

Java:
import java.io.Serializable;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class SaxVariante {

	public SaxVariante() {
		try {
			SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
			SAXParser saxParser = saxParserFactory.newSAXParser();
			XMLReader reader = saxParser.getXMLReader();
			reader.setContentHandler(new DefaultHandler(){

				private String element;
				private String text;
				private MyBean myBean;
				
				@Override
				public void characters(char[] arg0, int arg1, int arg2)
						throws SAXException {
					text = new String(arg0, arg1, arg2);
				}

				@Override
				public void endDocument() throws SAXException {
					System.out.println(myBean);
				}

				@Override
				public void endElement(String uri, String localName, String qName)
						throws SAXException {
					if(qName.equals("c"))
						myBean.setC(text);
					
					if(qName.equals("k"))
						myBean.setK(text);
					
				}

				@Override
				public void startDocument() throws SAXException {
					myBean = new MyBean();
				}

				
				
			});
			reader.parse("myXMLFile.xml");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
	
	public static void main(String[] args) {
		new SaxVariante();

	}

	class MyBean implements Serializable {
		 
		 private String c;
		 private String k;
		 
		
		 public MyBean() {
		 
			 this("","");
		 }
		 


		public MyBean(String c, String k) {
			setC(c);
			setK(k);
		}



		public String getC() {
			return c;
		}


		public void setC(String c) {
			this.c = c;
		}


		public String getK() {
			return k;
		}


		public void setK(String k) {
			this.k = k;
		}
		
		public String toString() {
			return "c=" + getC() +", k=" +getK();
		}
	 }
}
 
Zurück