# Werte in eine html- Datei schreiben



## MQue (26. Mai 2008)

Hallo,

ich möchte in eine bestehende HTML- Datei ein paar werte hineinschreiben,
Die html datei schaut so aus:


```
<table border="2" align="center" width="50%" bgcolor="#FFFFFF">
  					<tr>
    	   					<th>Spalte 1</th>
    	   					<th>Spalte 2</th>    
	   					<th>Spalte 3</th>	   
  					</tr>
  					<tr>
    	  					<td>Eintrag 1</td>
    	   					<td>Eintrag 1</td>  
           					<td>Eintrag 1</td>  	   
  					</tr>
   					<tr>
    	   					<td>Eintrag 2</td>
    	   					<td>Eintrag 2</td>   
	   					<td>Eintrag 2</td>  	   
  					</tr>
               // hier ginge es dann so weiter mit meinen Daten ...

				</table>
```

Meine Frage wäre jetzt, wie das am Besten zu lösen ist, ich lade mir die html- Vorlage in mein Java-Programm, schreibe meine Werte in die <table> und speichere dann die datei wieder raus oder gibts da eine bessere Möglichkeit das irgendwie so zu machen?


----------



## @x.l (26. Mai 2008)

Komfortabler ist es, das File als DOM-Baum einzulesen. Dann kannst du bedeutend einfacher Elemente hinzufügen/ändern/löschen...

HTML-Dokumente einlesen


----------



## MQue (26. Mai 2008)

@x.l hat gesagt.:
			
		

> Komfortabler ist es, das File als DOM-Baum einzulesen. Dann kannst du bedeutend einfacher Elemente hinzufügen/ändern/löschen...




Und wie geht das mit dem tidy, wie komme ich über tidy an die DOM- Struktur heran, gibts da irgendwo vielleicht ein beispiel,

Dankeschön für die Hilfe,


----------



## ms (26. Mai 2008)

Eine andere Möglichkeit wäre eine template engine wie zB Velocity zu verwenden.

ms


----------



## @x.l (26. Mai 2008)

Ist doch unter dem Link zu lesen:

```
Tidy tidy = new Tidy(); 
// tidy.setMakeClean( true );   // Ohne Störungen 
// tidy.setXmlTags( true );     // Eingabe als XML behandeln 
org.w3c.dom.Document node = tidy.parseDOM( in, null );
```

*in* kann dann bspw. der InputStream aus deiner Datei sein...

#edit: und der Rest findet sich eigentlich in der API...


----------



## MQue (26. Mai 2008)

so eine DOM- Struktur durchläuft man ja mit

while(irgendwas.hasNext()) {
   Object o = x.next;
}

Das gibts ja so jetzt nicht bei tidy, oder


Ich brauche ja eigentlich nur den HTML- code unten, also ist es am besten wenn ich nach der  id="anzeigeInTabelle" suche, mir dann den Node <table .. herausnehme und dann die ganzen Zeilen hinzufüge und dann wieder in meinen Datei schreibe, aber es geht eben um das, wie ich an diesen "Teil"- Node herankomme.


```
<table id="anzeigeInTabelle" border="2" align="center" width="50%" bgcolor="#FFFFFF">
                 <tr>
                         <th>Spalte 1</th>
                         <th>Spalte 2</th>   
                     <th>Spalte 3</th>      
                 </tr>
                 <tr>
                        <td>Eintrag 1</td>
                         <td>Eintrag 1</td> 
                          <td>Eintrag 1</td>        
                 </tr>
                  <tr>
                         <td>Eintrag 2</td>
                         <td>Eintrag 2</td>   
                     <td>Eintrag 2</td>        
                 </tr>
               // hier ginge es dann so weiter mit meinen Daten ...

            </table>
```


----------



## @x.l (26. Mai 2008)

Du erhältst doch ein Document-Objekt. Lass dir also das Tebellenelement mit Document#getElementById geben. Dem fügst du dann einen Knoten (also neue Zeile) hinzu - fertig!


```
Tidy tidy = new Tidy(); 
org.w3c.dom.Document node = tidy.parseDOM( in, null );

// hole Tabellenelement
Element tabNode = node.getElementById("anzeigeInTabelle");
// erzeuge neue Tabellenzeile
Element newRow = node.createElement("tr");
Element newCol = node.createElement("td");

// anhängen
newRow.appendChild(newCol);
tabNode.appendChild(newRow);
```


----------



## MQue (26. Mai 2008)

OK, kann ich das Ganze dann mit Tidy in eine File schreiben oder eben mit einem normalen FileWriter und von welchen Package ist "Element",

Danke


----------



## @x.l (26. Mai 2008)

???:L  Ich weiß nicht wo das Problem liegen soll... mit Tidy#parseDOM erhältst du doch das Document, kannst es dann bearbeiten und wenn du damit fertig bist schreibst du es wieder zurück!

#edit Das kannst du mit einem ganz normalen Writer machen. Element ist aus org.w3c.dom - genauso wie Document.


----------



## MQue (26. Mai 2008)

OK, so weit hab ich es verstanden, mein problem ist jetzt nur mehr, das ich das Element mit der id nicht finde, ich bekomme immer "null" zurück".
ich habs jetzt mit der HTML- Datei:


```
<html>
	<head>
	</head>	
	<body id="booodyyy">		
		Text
	</body>
</html>
```

versucht, bekomme aber immer noch "null" zurück, wenn ich: 


```
node = tidy.parseDOM( in, null);
        // hole Tabellenelement
        Element tabNode = node.getElementById("booodyyy");
        System.out.println("Das ist das tabNode: " + tabNode);
        // erzeuge neue Tabellenzeile
        Element newRow = node.createElement("tr");
        Element newCol = node.createElement("td");

        // anhängen
        newRow.appendChild(newCol);
        //tabNode.appendChild(newRow);
```

ausführe,

gibts dafür eine Erklärung, kann es sein, dass das nur bei einer XML- Datei funkt?

Vielen Dank die Hilfe,


----------



## @x.l (26. Mai 2008)

Es kann schon sein das es daran liegt. Es gibt manchmal Probleme, wenn eine Datei nicht ganz "wohlgeformt" ist. 
Hätte allerdings gedacht, dass der Parser damit umgehen kann. Musste vllt. doch noch einen anderen Parser versuchen...


----------



## MQue (26. Mai 2008)

Aber wohlgeformtere als dieses HTML- Dokument geht nicht mehr, schätz ich mal, ich werds mal mit einem anderen Parser versuchen, vielen Dank für die Tipps

```
<html>
   <head>
   </head>   
   <body id="booodyyy">      
      Text
   </body>
</html>
```


----------



## MQue (26. Mai 2008)

Nö find keinen richtigen HTM- Parser, 
Hätte vielleicht noch jemand eine Idee, wie ich das am Einfachsten realisieren könnte?


----------



## ms (26. Mai 2008)

ms hat gesagt.:
			
		

> Eine andere Möglichkeit wäre eine template engine wie zB Velocity zu verwenden.



ms


----------



## Escorter (26. Mai 2008)

Du musst es ja nicht unbedingt parsen, sondern du suchst nach dem String. Ermittelst dann das Ende des Tags und schreibst an die Stelle den neuen Unhalt, dann fügst du wieder alles zusammen und schreibst es in eine Datei.

Gruß,
Esco


----------



## MQue (27. Mai 2008)

So ich bin jetzt so weit, dass ich fast an meinene Taxten drann bin.
Ich habe folgendes gemacht: 


```
<th align="left">Den Text brauche ich</th>
```


```
for(int i = 0; i < child.getLength(); i++) { 
            cchild = child.item(i).getChildNodes();
            for(int j = 0; j < cchild.getLength(); j++) {
                System.out.println("Das sollte mein Text sein: " + cchild.item(j).getNodeValue());
                }
            }
```

Das problem ist nur, dass jetzt gar nichts mehr ausgegeben wird, wenn ich cchild.item(j).getNodeName hinschreibe, dann wird th ausdgegeben, aber bei der Methode gerNodeValue() bekomme ich gar keine ausgaben,
weiß vielleicht jemand wieso das so ist, ich hab keine Ahnung, ich hab auch schon probiert, dass ich von <th> das child nehme, aber da bekomme ich nur die Ausgabe #text,

Wäre sehr dankbar wenn mir da jemand helfen könnte,

Vielen Dank


----------



## @x.l (27. Mai 2008)

Probier mal Node#getTextContent


----------



## MQue (27. Mai 2008)

ich habs jetzt, man muss tatsächlich noch getchild().getNodeValue() schreiben dann kommt man hin,
jetzt klappts, auch mit dem hinausschreiben,

Vielen Dank für die Hilfe,


----------

