# HTML-Mail auslesen



## seven (7. Januar 2010)

Hallo,

ich möchte eine HTML-Mail auslesen, in der wichtige Daten in einer Tabelle stehen. Die Anzahl der Zeilen kann unterschiedlich sein.
Das habe ich soweit geschafft. Das Programm öffnet das Mailpostfach, durchsucht alle eMails in denen im Betreff ein bestimmter 
String steht und liest diese bis zu einem Punkt aus. 
Leider hört es aus irgendwelchen Gründen mitten in der Tabelle auf, es kommt auch keine Fehlermeldung. 
Ich habe mir schon den Source der eMail angeschaut, kann aber nichts ungewöhnliches feststellen.
Da ich mit Eclipse arbeite, bin ich auch schon step by step durchgegangen und irgendwann, beim durchlaufen der Tabelle mit 
den Daten, hört er auf und schließt das Postfach ordnungsgemäß.

Das wird in der Console von Eclipse ausgegeben:

```
Nachricht: 25
Von: [xxxxxx@xxxxxxxx.de]
Betreff: Buchungsbestaetigung Buchungsnummer 425041 
Gesendet am: Tue Dec 15 16:06:25 CET 2009
Content-Type: multipart/alternative; 
	boundary="----_=_NextPart_000_0013B6EA.4B27B3EA"

javax.mail.internet.MimeMultipart@edc3a2
Encoding: ISO8859_1
C: RETR 26
S: +OK 35586 byte(s)
X-Message-Delivery: Vj0xLjE7dXM9MDtsPTA7YT0wO0Q9MTtTQ0w9MQ==
X-Message-Status: n:0
X-SID-PRA: xxxx@xxxxxx.de
X-Message-Info: JGTYoYF78jHgIR/d6NreP8xppbXtTv5jqMxc64GbnmqGzMr2ZQgTusit0C5h6SuZcFrWDgSTCmHSYxPsgsjxFg==
Received: from smtp-out-130.synserver.de ([212.40.180.130]) by snt0-mc2-f26.Snt0.xxxxxxx.com with xxxxxx SMTPSVC(6.0.3790.3959);
	 Tue, 15 Dec 2009 07:06:25 -0800
Received: (qmail 26200 invoked by uid 0); 15 Dec 2009 15:06:23 -0000
X-SynServer-TrustedSrc: 1
X-SynServer-AuthUser: info@xxxxxxx.de
X-SynServer-PPID: 26110
Received: from xxxx01.synserver.de (HELO 192.168.20.7) [217.119.48.193]
  by blue-ld-125.synserver.de with SMTP; 15 Dec 2009 15:06:23 -0000
To: xxxx@xxxxxxxxxx.de
From: xxxxx@xxxxxxxxxxx.de
Subject: Buchungsbestaetigung Buchungsnummer 425041 
Date: 15 Dec 2009 15:06:25 UT
Priority: normal
X-Priority: 3 (Normal)
Importance: normal
X-Mailer: DvISE by Tobit Software, Germany (0250.444B46464E464A4C4C4E)
X-David-Sym: 0
X-David-Flags: 0
Message-ID: <0013B6EA.4B27B3EA@192.168.20.7>
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="----_=_NextPart_000_0013B6EA.4B27B3EA"
Return-Path: xxxx@xxxxxxx.de
X-OriginalArrivalTime: 15 Dec 2009 15:06:25.0642 (UTC) FILETIME=[2BC6A4A0:01CA7D98]

This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_000_0013B6EA.4B27B3EA
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Diso-8859-1"><style type=3D"text/css"><!--body,td,th {	font-family: Verdana, Arial, Helvetica, sans-serif;	font-size: 12px;}.Stil1 {font-size: xx-small}.Stil3 {font-size: xx-small; font-weight: bold; }body {	margin-left: 10px;}--></style></head><body><div align=3D"center"><table width=3D"600" border=3D"0" style=3D"text-align: left;">  <tr>    <td><table border=3D"0">      <tr>        <td width=3D"350">&nbsp;</td>        <td width=3D"250"><p align=3D"right"><img src=3D"d:\Daten\xxxx_MessageController\xxxxxx_Booking\xxxxxxxx-testhotel\Logo.gif"><br />        </p></td>      </tr>	  <tr>        <td width=3D"350">&nbsp;</td>        <td width=3D"250"><div align=3D"right"><br />          xxxxxxxx, den 15.12.2009</div></td>      </tr>    </table></td>  </tr>  <tr>    <td>      <strong>
Buchungsbest&auml;tigung</strong></td>  </tr>  <tr>    <td>&nbsp;</td>  </tr>  <tr>    <td>Hiermit best&auml;tigen wir Ihnen Ihre verbindliche Buchung, die wir unter der <strong><br />Buchungsnummer 425041 </strong>registriert haben. Nachstehend die von Ihnen eingegebenen Buchungsdaten: </FONT></td>  </tr>  <tr>    <td>&nbsp;</td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade ></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td width=3D"22%"><span class=3D"Stil3">Anreise:</span></td>        <td width=3D"32%">16.12.2009</td>        <td width=3D"17%"><span class=3D"Stil3">Abreise:</span></td>        <td width=3D"29%">23.12.2009 </td>      </tr>      <tr>        <td><span class=3D"Stil3">Buchungsnummer:</span></td>        <td>425041</td>        <td><span class=3D"Stil3">Buchungsdatum:</span></td>        <td>15.12.2009</td>      </tr>      <tr>        <td><span class=3D"Stil3">Gesamtsumme:</span></td>        <td>2,695,00 </td>        <td>
&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td><span class=3D"Stil3">Alle Preise in:</span></td>        <td>EURO</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td><span class=3D"Stil3">Bemerkungen:</span></td>        <td colspan=3D"3" valign=3D"top">+++ Anreise nach 18 Uhr +++ Testbemerkung</td>        </tr> <tr>        <td><span class=3D"Stil3">Anreisezeit ca.:</span></td>        <td colspan=3D"3" valign=3D"top">18:00</td>        </tr>		<tr>        <td>&nbsp;</td>        <td colspan=3D"3" valign=3D"top"></td>        </tr>    </table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table cellspacing=3D"0" rules=3D"all" border=3D"1" style=3D"border-collapse:collapse;">
	<tr>
		<td>Datum</td><td>Anzahl</td><td>Zimmertyp</td><td>Einzelpreis</td><td>Einzelsumme</td>
	</tr><tr>
		<td>16.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>17.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>18.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>19.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>20.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>21.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>22.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>
	</tr><tr>
		<td>16.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>17.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>18.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>19.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>         <<<----- hier bricht das Programm ab (nach dem Datum)
	</tr><tr>
		<td>20.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>21.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>22.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>
	</tr><tr>
		<td>16.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>17.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>18.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>19.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>20.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>21.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr><tr>
		<td>22.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>
	</tr>
</table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td> </td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td colspan=3D"3"><p class=3D"Stil3">Ihre Angaben<br />          <br /></p>          </td>        </tr>      <tr>        <td width=3D"45%">Frau Prof.</td>        <td width=3D"14%">&nbsp;</td>        <td width=3D"41%">&nbsp;</td>      </tr>      <tr>        <td>Anni</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td>Schmidt</td>        <td><span class=3D"Stil3">Tel:</span></td>        <td>0123456789 </td>      </tr>      <tr>        <td>Bergbau GmbH</td>        <td><span class=3D"Stil3">Fax:</span></td>        <td>1234987654</td>      </tr>      <tr>        <td>Begstr.2</td>        <td><span class=3D"Stil3">Mobil:</span></td>        <td>0151987553</td>      </tr>      <tr>        <td>84467 München</td>
        <td><span class=3D"Stil3">EMail:</span></td>        <td>xxxx@xxxxxxxl.de</td>      </tr>      <tr>        <td>Deutschland</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>  <tr>        <td>&nbsp;</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr><tr>        <td colspan=3D"2"></td>        <td></td>      </tr><tr>        <td colspan=3D"2">&nbsp;</td>        <td>&nbsp;</td>      </tr><tr>        <td colspan=3D"3"></td>        </tr><tr>        <td colspan=3D"3"></td>        </tr    ></table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td colspan=3D"3"><p class=3D"Stil3">Ihr Gastgeber<br />          <br /></p>          </td>        </tr>      <tr>        <td width=3D"45%">xxx-xxxx Testhotel</td>        <td width=3D"14%"><span class=3D"Stil3">Tel:</span></td>        <td width=3D"41%">03 51 25 44 1-0 </td>      </tr>      <tr>        <td>
xxxxxxxxx 22</td>        <td><span class=3D"Stil3">Fax:</span></td>        <td>xxxxx xxx xxx</td>      </tr>      <tr>        <td>111111 xxxxx</td>        <td><span class=3D"Stil3">EMail:</span></td>        <td>xxxx@xxxxxxxx.de</td>      </tr>      <tr>        <td>Deutschland</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td>&nbsp;</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td colspan=3D"3">&lt;br&gt;</td>      </tr>      <tr>        <td colspan=3D"3">&nbsp;</td>        </tr>    </table></td>  </tr>   <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><p>Eventuelle R&uuml;ckfragen richten Sie bitte direkt an Ihren Gastgeber.<br />      Diese E-Mail wurde automatisch erzeugt. Bitte antworten Sie daher nicht auf diese E-Mail.<br>      Um  Ihren Gastgeber zu kontaktieren, nutzen die bitte die EMail Adresse des Gastgebers.</p>      </td>  </tr>  <tr>    <td>
  .
  AGB
  .
------------------------------------------------------------------------</p></div>'<br />      <span class=3D"Stil3">Stornofristen</span><br />      <table cellspacing=3D"0" rules=3D"all" border=3D"1" 

	</tr>
</table></td>  </tr></table></div></body></html>

------_=_NextPart_000_0013B6EA.4B27B3EA--
```

Java-Code Schnipsel:


```
Object content = m.getContent();
				if (content instanceof String) {
					body = (String) content;
				} else if (content instanceof Multipart) {
					Multipart mp = (Multipart) content;
					Part part = m;
					int anz = 0;
					for (int j = 0; j < mp.getCount(); j++) {
						part = mp.getBodyPart(j);

						//StringBuffer readBuffer = new StringBuffer();

						MimeBodyPart mimePart = (MimeBodyPart) part;

						final StringBuilder contentSB = new StringBuilder();
						InputStream is = mp.getBodyPart(j).getInputStream();

						InputStreamReader isr = new InputStreamReader(is, Charset.forName("iso-8859-1"));
						BufferedReader br = new BufferedReader(isr);

						HTMLEditorKit htmlKit = new HTMLEditorKit();
						HTMLDocument htmlDoc = (HTMLDocument) htmlKit
								.createDefaultDocument();
						HTMLEditorKit.Parser parser = new ParserDelegator();
						HTMLEditorKit.ParserCallback callback = htmlDoc
								.getReader(0);
						parser.parse(br, callback, true);

						HTMLDocument.Iterator iterator = htmlDoc
								.getIterator(HTML.Tag.CONTENT);

						for (iterator = htmlDoc.getIterator(HTML.Tag.CONTENT); 
							iterator.isValid(); iterator.next()) {
							int startOffset = iterator.getStartOffset();
							int endOffset = iterator.getEndOffset();
							int length = endOffset - startOffset;
							String text = htmlDoc.getText(startOffset, length);
							arrMail.add(text);
						}
```

Da ich damit noch keine Erfahrung habe, stehe ich jetzt ganz schön auf dem Schlauch.
Warum durchläuft das Programm die Mail nicht bis zum Ende?
Gibt es evtl. eine bessere Lösung?

Ich danke schon mal Voraus.

Gruß seven


----------



## RoCMe (7. Januar 2010)

Hi!

Willst du nur die Daten aus der Tabelle in deinem Programm verwenden? Das würde ich mit Tagsoup parsen und dann mit XPATH die benötigten Werte auslesen... Das wird meiner Meinung nach deutlich kürzer...

Kann aber auch sein, dass ich gerade einfach nicht sehe, wo das eigentliche Problem liegt...

Gruß,

RoCMe


----------



## seven (8. Januar 2010)

Hi RoCMe ,

vielen dank für deine Antwort.  

Mit XPath habe ich schon gearbeitet und Tagsoup müßte ich mir erstmal anschauen.
Ich habe mir mal die Struktur der Mail angeschaut und da sind 6 Tabellen in einer Tabelle. Für mich sind eigentlich nur die 
Daten aus Tabelle 2, 3 und 4 relevant.
Schau mal in das Code-feld, dort habe ich geschrieben, wo das Programm abricht.
<td>19.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>         <<<----- hier bricht das Programm ab (nach dem Datum)

Irgendwie muß ich auch die Umlaute, die in der HTML-Mail sind, umwandeln und deshalb habe ich das HTMLEditorKit genommen.

Dann habe ich die Mail erstmal in eine HTML-Datei lokal gespeichert, diese Datei erneut ausgelesen und das Programm bricht wieder an der selben Stelle ab. 

Jetzt werde ich mir mal Tagsoup anschauen, vielleicht bringt mich das weiter. 

Für weitere Tipps wäre ich sehr dankbar.

Gruß seven


----------



## RoCMe (8. Januar 2010)

Hi!

Sicher nicht schön, aber wenn ich deine Tabelle aus einer Datei in einen BufferedReader einlese und an diese Funktion übergebe, dann gibt die genau die Daten aus, die du haben wolltest:


```
/** only method we're really interested in :) */
	private void parse(BufferedReader htmlSource) throws Exception{
		//parse with tagsoup parser...
		SAXBuilder saxBuilder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser");
		//read document
		Document document = saxBuilder.build(htmlSource);
		//get all needed rows
		///
		XPath x = XPath.newInstance("/h:html/h:body/h:div/h:table/h:tr[9]/h:td/h:table/h:tr");
		x.addNamespace("h", "http://www.w3.org/1999/xhtml");		
		List rows = x.selectNodes(document);
		System.out.println("SIZE: " + rows.size());
		//iterate over all rows, starting with 2. ...
		Iterator it = rows.iterator();
		it.next();
		do {
			Object o = it.next();
			if (o instanceof	Element) {
				parseRow((Element) o);
				System.out.println(((Element)o));
			}
			else {
				System.err.println("NON-ELEMENT OBJECT: " + o);
			}
		} while (it.hasNext());

		
	}
	private void parseRow(Element row) {
		Iterator it = row.getChildren().iterator();
		String entryRepresentation = "Datum: " + ((Element) it.next()).getText() + " ";
		 entryRepresentation += "Anzahl: " + ((Element) it.next()).getText() + " ";
		 entryRepresentation += "Zimmertyp: " + ((Element) it.next()).getText() + " ";
		 entryRepresentation += "Einzelpreis: " + ((Element) it.next()).getText() + " ";
		 entryRepresentation += "Einzelsumme: " + ((Element) it.next()).getText() + " ";
	}
```

Gruß,

RoCMe


----------



## seven (12. Januar 2010)

HI,

ich habe mir das angeschaut und übernommen. 
Leider bekomme ich eine Fehlermeldung und die Ausgabe in der Konsole für SIZE = 0.
Fehlermeldung:

SIZE: 0
Exception in thread "main" java.util.NoSuchElementException
	at java.util.AbstractList$Itr.next(AbstractList.java:350)
	at xxxxxxxx.TestTagsoup.parse(TestTagsoup.java:218)
	at xxxxxxxx.TestTagsoup.main(TestTagsoup.java:195)

Die Meldung verstehe ich nicht, weil der Bufferedreader nicht leer ist.

Gruß seven


----------



## RoCMe (12. Januar 2010)

Hi!

Ich glaube, das hat nichts mit dem BufferedReader zu tun, sondern mit irgend einer Liste, die keine Elemente enthält...
Leider kann ich mit der Fehlermeldung nicht viel anfangen: An welcher Stelle hakt es denn genau (Welchen Zeilen in meinem Code entsprechen denn die ausgeworfenen Zeilen 195 und 218?

EDIT: Sorry, habs verstanden, kannte nur meinen Code nicht mehr... Das Problem ist anscheinend, dass die Liste "rows"  keine Elemente hat - und darin sollten ja eigentlich alle Zeilen deiner Tabelle stehen... 
Spiel mal ein wenig mit dem XPath rum - anscheinend passt der nicht richtig... Bei mir hats aber definitiv funktioniert!

Gruß,

RoCMe


----------



## seven (12. Januar 2010)

Hi,

das ging jetzt aber flott.  

sorry, is klar das du mit den Zeilennummern nichts anfangen kannst. Mein Fehler.  

Es ist Zeile 
	
	
	



```
it.next();
```
.

Gruß seven


----------



## RoCMe (12. Januar 2010)

Ja, die Mail Benachrichtigung ist was tolles 
Ich bin im Moment gezwungen, am Telefon zu sitzen und auf genervt auf Bedienung in einer Hotline zu warten *grml*

@Topic:
Siehe oben - spiel mal mit dem XPATH rum - irgendwas stimmt damit wohl nicht...


----------



## seven (12. Januar 2010)

So eine Hotline ist schon was Tolles.  

Ich habe Mailbenachrichtigungen schon richtig lieb gewonnen. 
Das XPath sieht garnicht mal so schlecht aus, aber vllt. liegt es daran, dass in der ersten und siebten Zeile noch eine Tabelle ist. 
Ist aber auch Quatsch, denn es wird ja auf die 9. Zeile verwiesen, wo die wichtigen Daten stehen.
Ich werde mir noch mal XPath anschauen und dann rumprobieren.

Nochmal Danke. 

Gruß seven


----------



## seven (13. Januar 2010)

Hallo,

 ich habe jetzt mit XPath rumexperimentiert und leider kein Erfolg gehabt.


```
SAXBuilder saxBuilder = new SAXBuilder(
					"org.ccil.cowan.tagsoup.Parser");
Document document = (Document) saxBuilder.build(is);

			String sXPathExpression = "//html/body/div";
			XPath xPathReader = XPath.newInstance(sXPathExpression);
			Object oElement = xPathReader.selectSingleNode(document);

DocType doctype = new DocType( "html", "-//W3C//DTD XHTML 1.0 Transitional//EN") ;
			document.  setDocType  ( (DocType) doctype );

DocType docType = (DocType) document.getDocType();
			System.out.println( "Element: " +   docType.getElementName  () );
			System.out.println( "Public ID: " +   docType.getPublicID()   );
			System.out.println( "System ID: " +   docType.getSystemID()   );
			
			List ergebnis = XPath.selectNodes( document, "/html/body/div" );
			System.out.println("Ergebnis: " + ergebnis);
			XPath xpath = XPath.newInstance( "/child::html/child::body/child::div/child::table" );
			List ergebnis2 = xpath.selectNodes( document );
			System.out.println("Ergebnis2: " + ergebnis2);

String sValue = null;
			if (oElement == null) {
				// Knoten/Attribut existiert gar nicht, eventuell falscher
				// XPath-Ausdruck
			} else if (oElement.getClass().getName().equalsIgnoreCase(
					"org.jdom.Attribute")) {
				Attribute jdomAttribute = (Attribute) oElement;
				sValue = jdomAttribute.getValue();
				System.out.println("Attribut: " + sValue);
			} else if (oElement.getClass().getName().equalsIgnoreCase(
					"org.jdom.Element")) {
				Element jdomElement = (Element) oElement;
				sValue = jdomElement.getValue();
				System.out.println("Element: " + sValue);
			}
```

Ausgabe auf der Console:
Element: html
Public ID: null
System ID: -//W3C//DTD XHTML 1.0 Transitional//EN
Ergebnis: []
Ergebnis2: []

Im InputStream ist alles drin,  wenn ich es in eine Datei schreiben lasse, steht das ganze HTML drin. 

Ich weiß jetzt auch nicht mehr weiter. 
Was stimmt hier nicht?

Gruß seven.


----------



## RoCMe (13. Januar 2010)

Hi!

Ich hab gerade wenig Zeit, aber ich glaube es hakt irgendwie an deinem Namespace:

Ich habe deinen Code so modifiziert:

```
...
//"h" eingefügt
String sXPathExpression = "//h:html/h:body/h:div";
XPath xPathReader = XPath.newInstance(sXPathExpression);
//folgende Zeile eingefügt
xPathReader.addNamespace("h","http://www.w3.org/1999/xhtml");
Object oElement = xPathReader.selectSingleNode(document);
System.out.println("HALLO: " + oElement);
...
```

und dann wird das gesuchte Element ausgegeben. Wenn ich das wieder rausnehme und nur das sysout Statement stehen lasse, gibts lediglich ein "null" ...

Hoffe, das hilft dir erst mal weiter.

Sonst gucke ich später noch mal 

Gruß,

RoCMe


----------



## seven (13. Januar 2010)

Hi,

du netter Helfer.
es funktioniert immer noch nicht. Als Ausgabe kommt "null".
Ich werde natürlich auch noch weiterprobieren und hoffe weiter auf Hilfe.

Gruß seven.


----------



## RoCMe (13. Januar 2010)

Gut, noch mal ganz langsam. 

Ich weiß gerade nicht genau warum, aber anscheinend verlangt jdom, dass du jedem Tag einen Namespace verpasst. D.h., was früher ein "html/body" war, wird jetzt zu einem "namespace:html/namespace:body" usw. Wie du deinen Namespace nennst, ist völlig egal.
Du erzeugst wie gewohnt deine XPath Instanz und rufst dann deren addNameSpace() Methode auf, um deinen Namespace zu setzen, z.B. so:


```
String sXPathExpression = "//h:html/h:body/h:div";
		XPath xPathReader = XPath.newInstance(sXPathExpression);
		xPathReader.addNamespace("h", "http://www.w3.org/1999/xhtml");
```

Zumindest bei mir klappt das so! Damit wir nicht aneinander vorbei reden, gibts hier noch mal meinen kompletten Code:


```
public class ParseHTML {

	/** the html stuff */
	BufferedReader htmlSource;

	/** stupid constructor */
	public ParseHTML(String file) throws Exception {
		File f = new File(file);
		htmlSource = new BufferedReader(new FileReader(f));
		String line = htmlSource.readLine();
		while (line != null) {
			System.out.print(line);
			line = htmlSource.readLine();
		}
		System.out.println();
		htmlSource = new BufferedReader(new FileReader(f));
	}

	private void sevensParseMethod(BufferedReader is) throws Exception {
		SAXBuilder saxBuilder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser");
		Document document = (Document) saxBuilder.build(is);
		System.out.println(document);

		String sXPathExpression = "//h:html/h:body/h:div";
		XPath xPathReader = XPath.newInstance(sXPathExpression);
		xPathReader.addNamespace("h", "http://www.w3.org/1999/xhtml");
		Object oElement = xPathReader.selectSingleNode(document);
		System.out.println("HALLO " + oElement);

		DocType doctype = new DocType("html",
				"-//W3C//DTD XHTML 1.0 Transitional//EN");
		document.setDocType((DocType) doctype);

		DocType docType = (DocType) document.getDocType();
		System.out.println("Element: " + docType.getElementName());
		System.out.println("Public ID: " + docType.getPublicID());
		System.out.println("System ID: " + docType.getSystemID());

		List ergebnis = XPath.selectNodes(document, "/html/body/div");
		System.out.println("Ergebnis: " + ergebnis);
		XPath xpath = XPath
				.newInstance("/child:html/child:body/child:div/child:table");
		xpath.addNamespace("child", "http://www.w3.org/1999/xhtml");
		List ergebnis2 = xpath.selectNodes(document);
		System.out.println("Ergebnis2: " + ergebnis2);

		String sValue = null;
		if (oElement == null) {
			// Knoten/Attribut existiert gar nicht, eventuell falscher
			// XPath-Ausdruck
		} else if (oElement.getClass().getName().equalsIgnoreCase(
				"org.jdom.Attribute")) {
			Attribute jdomAttribute = (Attribute) oElement;
			sValue = jdomAttribute.getValue();
			System.out.println("Attribut: " + sValue);
		} else if (oElement.getClass().getName().equalsIgnoreCase(
				"org.jdom.Element")) {
			Element jdomElement = (Element) oElement;
			sValue = jdomElement.getValue();
			System.out.println("Element: " + sValue);
		}
	}
public static void main(String[] arg) throws Exception {
		ParseHTML parseIt = new ParseHTML("test.html");
		parseIt.sevensParseMethod(parseIt.htmlSource);
	}
}
```

Die Datei "test.hml", die ich einlese hänge ich auch noch mal an (als .txt, weil ich keine .htmls anhängen darf ), damit es da keine Missverständnisse gibt!

Meine Ausgabe sieht dann so aus:


```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Diso-8859-1"><style type=3D"text/css"><!--body,td,th {	font-family: Verdana, Arial, Helvetica, sans-serif;	font-size: 12px;}.Stil1 {font-size: xx-small}.Stil3 {font-size: xx-small; font-weight: bold; }body {	margin-left: 10px;}--></style></head><body><div align=3D"center"><table width=3D"600" border=3D"0" style=3D"text-align: left;">  <tr>    <td><table border=3D"0">      <tr>        <td width=3D"350">&nbsp;</td>        <td width=3D"250"><p align=3D"right"><img src=3D"d:\Daten\xxxx_MessageController\xxxxxx_Booking\xxxxxxxx-testhotel\Logo.gif"><br />        </p></td>      </tr>	  <tr>        <td width=3D"350">&nbsp;</td>        <td width=3D"250"><div align=3D"right"><br />          xxxxxxxx, den 15.12.2009</div></td>      </tr>    </table></td>  </tr>  <tr>    <td>      <strong>Buchungsbest&auml;tigung</strong></td>  </tr>  <tr>    <td>&nbsp;</td>  </tr>  <tr>    <td>Hiermit best&auml;tigen wir Ihnen Ihre verbindliche Buchung, die wir unter der <strong><br />Buchungsnummer 425041 </strong>registriert haben. Nachstehend die von Ihnen eingegebenen Buchungsdaten: </FONT></td>  </tr>  <tr>    <td>&nbsp;</td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade ></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td width=3D"22%"><span class=3D"Stil3">Anreise:</span></td>        <td width=3D"32%">16.12.2009</td>        <td width=3D"17%"><span class=3D"Stil3">Abreise:</span></td>        <td width=3D"29%">23.12.2009 </td>      </tr>      <tr>        <td><span class=3D"Stil3">Buchungsnummer:</span></td>        <td>425041</td>        <td><span class=3D"Stil3">Buchungsdatum:</span></td>        <td>15.12.2009</td>      </tr>      <tr>        <td><span class=3D"Stil3">Gesamtsumme:</span></td>        <td>2,695,00 </td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td><span class=3D"Stil3">Alle Preise in:</span></td>        <td>EURO</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td><span class=3D"Stil3">Bemerkungen:</span></td>        <td colspan=3D"3" valign=3D"top">+++ Anreise nach 18 Uhr +++ Testbemerkung</td>        </tr> <tr>        <td><span class=3D"Stil3">Anreisezeit ca.:</span></td>        <td colspan=3D"3" valign=3D"top">18:00</td>        </tr>		<tr>        <td>&nbsp;</td>        <td colspan=3D"3" valign=3D"top"></td>        </tr>    </table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table cellspacing=3D"0" rules=3D"all" border=3D"1" style=3D"border-collapse:collapse;">	<tr>		<td>Datum</td><td>Anzahl</td><td>Zimmertyp</td><td>Einzelpreis</td><td>Einzelsumme</td>	</tr><tr>		<td>16.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>	</tr><tr>		<td>17.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>	</tr><tr>		<td>18.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>	</tr><tr>		<td>19.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>	</tr><tr>		<td>20.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>	</tr><tr>		<td>21.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>	</tr><tr>		<td>22.12.2009</td><td>1</td><td>Grp1</td><td>77,00</td><td>77,00</td>	</tr><tr>		<td>16.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>	</tr><tr>		<td>17.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>	</tr><tr>		<td>18.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>	</tr><tr>		<td>19.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>	</tr><tr>		<td>20.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>	</tr><tr>		<td>21.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>	</tr><tr>		<td>22.12.2009</td><td>2</td><td>Grp2</td><td>66,00</td><td>132,00</td>	</tr><tr>		<td>16.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>	</tr><tr>		<td>17.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>	</tr><tr>		<td>18.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>	</tr><tr>		<td>19.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>	</tr><tr>		<td>20.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>	</tr><tr>		<td>21.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>	</tr><tr>		<td>22.12.2009</td><td>4</td><td>Grp4</td><td>44,00</td><td>176,00</td>	</tr></table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td> </td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td colspan=3D"3"><p class=3D"Stil3">Ihre Angaben<br />          <br /></p>          </td>        </tr>      <tr>        <td width=3D"45%">Frau Prof.</td>        <td width=3D"14%">&nbsp;</td>        <td width=3D"41%">&nbsp;</td>      </tr>      <tr>        <td>Anni</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td>Schmidt</td>        <td><span class=3D"Stil3">Tel:</span></td>        <td>0123456789 </td>      </tr>      <tr>        <td>Bergbau GmbH</td>        <td><span class=3D"Stil3">Fax:</span></td>        <td>1234987654</td>      </tr>      <tr>        <td>Begstr.2</td>        <td><span class=3D"Stil3">Mobil:</span></td>        <td>0151987553</td>      </tr>      <tr>        <td>84467 München</td>        <td><span class=3D"Stil3">EMail:</span></td>        <td>xxxx@xxxxxxxl.de</td>      </tr>      <tr>        <td>Deutschland</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>  <tr>        <td>&nbsp;</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr><tr>        <td colspan=3D"2"></td>        <td></td>      </tr><tr>        <td colspan=3D"2">&nbsp;</td>        <td>&nbsp;</td>      </tr><tr>        <td colspan=3D"3"></td>        </tr><tr>        <td colspan=3D"3"></td>        </tr    ></table></td>  </tr>  <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><table width=3D"100%" border=3D"0">      <tr>        <td colspan=3D"3"><p class=3D"Stil3">Ihr Gastgeber<br />          <br /></p>          </td>        </tr>      <tr>        <td width=3D"45%">xxx-xxxx Testhotel</td>        <td width=3D"14%"><span class=3D"Stil3">Tel:</span></td>        <td width=3D"41%">03 51 25 44 1-0 </td>      </tr>      <tr>        <td>xxxxxxxxx 22</td>        <td><span class=3D"Stil3">Fax:</span></td>        <td>xxxxx xxx xxx</td>      </tr>      <tr>        <td>111111 xxxxx</td>        <td><span class=3D"Stil3">EMail:</span></td>        <td>xxxx@xxxxxxxx.de</td>      </tr>      <tr>        <td>Deutschland</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td>&nbsp;</td>        <td>&nbsp;</td>        <td>&nbsp;</td>      </tr>      <tr>        <td colspan=3D"3">&lt;br&gt;</td>      </tr>      <tr>        <td colspan=3D"3">&nbsp;</td>        </tr>    </table></td>  </tr>   <tr>    <td><hr size=3D"5" color=3D"#cddaeb" noshade></td>  </tr>  <tr>    <td><p>Eventuelle R&uuml;ckfragen richten Sie bitte direkt an Ihren Gastgeber.<br />      Diese E-Mail wurde automatisch erzeugt. Bitte antworten Sie daher nicht auf diese E-Mail.<br>      Um  Ihren Gastgeber zu kontaktieren, nutzen die bitte die EMail Adresse des Gastgebers.</p>      </td>  </tr>  <tr>    <td>  .  AGB  .------------------------------------------------------------------------</p></div>'<br />      <span class=3D"Stil3">Stornofristen</span><br />      <table cellspacing=3D"0" rules=3D"all" border=3D"1" 	</tr></table></td>  </tr></table></div></body></html>
[Document: [DocType: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">], Root is [Element: <html [Namespace: http://www.w3.org/1999/xhtml]/>]]
HALLO [Element: <div [Namespace: http://www.w3.org/1999/xhtml]/>]
Element: html
Public ID: null
System ID: -//W3C//DTD XHTML 1.0 Transitional//EN
Ergebnis: []
Ergebnis2: [[Element: <table [Namespace: http://www.w3.org/1999/xhtml]/>]]
Element:                   xxxxxxxx, den 15.12.2009      
BuchungsbestätigungHiermit bestätigen wir Ihnen Ihre verbindliche Buchung, die wir unter der Buchungsnummer 425041 registriert haben. Nachstehend die von Ihnen eingegebenen Buchungsdaten: Anreise:16.12.2009Abreise:23.12.2009 Buchungsnummer:425041Buchungsdatum:15.12.2009Gesamtsumme:2,695,00 
Alle Preise in:EUROBemerkungen:+++ Anreise nach 18 Uhr +++ TestbemerkungAnreisezeit ca.:18:00DatumAnzahlZimmertypEinzelpreisEinzelsumme16.12.20091Grp177,0077,0017.12.20091Grp177,0077,0018.12.20091Grp177,0077,0019.12.20091Grp177,0077,0020.12.20091Grp177,0077,0021.12.20091Grp177,0077,0022.12.20091Grp177,0077,0016.12.20092Grp266,00132,0017.12.20092Grp266,00132,0018.12.20092Grp266,00132,0019.12.20092Grp266,00132,0020.12.20092Grp266,00132,0021.12.20092Grp266,00132,0022.12.20092Grp266,00132,0016.12.20094Grp444,00176,0017.12.20094Grp444,00176,0018.12.20094Grp444,00176,0019.12.20094Grp444,00176,0020.12.20094Grp444,00176,0021.12.20094Grp444,00176,0022.12.20094Grp444,00176,00 Ihre Angaben                    Frau Prof.AnniSchmidtTel:0123456789 Bergbau GmbHFax:1234987654Begstr.2Mobil:015198755384467 MünchenEMail:xxxx@xxxxxxxl.deDeutschlandIhr Gastgeber                    xxx-xxxx TesthotelTel:03 51 25 44 1-0 
xxxxxxxxx 22Fax:xxxxx xxx xxx111111 xxxxxEMail:xxxx@xxxxxxxx.deDeutschland<br>Eventuelle Rückfragen richten Sie bitte direkt an Ihren Gastgeber.      Diese E-Mail wurde automatisch erzeugt. Bitte antworten Sie daher nicht auf diese E-Mail.      Um  Ihren Gastgeber zu kontaktieren, nutzen die bitte die EMail Adresse des Gastgebers.      
  .
  AGB
  .
------------------------------------------------------------------------'      Stornofristen
```

Falls du Fragen hast - immer her damit 

Gruß,

RoCMe


----------



## seven (15. Januar 2010)

Hi RoCMe,

Ja ... nee, etwas hab ich schon kapiert.  
Und langsam brauchen wir auch nicht machen, denn so alt bin ich noch nicht.   

Bin jetzt fertig und es funktioniert alles wie es soll. 

Also, wer das gleiche Problem mal haben sollte, der schaue sich den Java-Code von RoCMe an.

Vielen Dank RoCMe für die Hilfe.

Gruß seven.


----------

