# Whitespaces verschieben Inhalte



## wdmprojekt (7. Sep 2010)

Hallo,

ich habe folgendes Problem für das ich eine Lösung suche:

Beim Parsen eines XML Dokuments werden die einzelnen Tags
<tag></tag> normaler Weise einem Tabellenfeld zugeordnet.
Bei mir ist es nun so, dass wenn ein Tag Whitespace
beinhaltet, wie zum Beispiel <tag>Ein Text</tag>, nun
der erste String in das erste Tabellenfeld und der
zweite String in das zweite Tabellenfeld geschrieben wird.

Wie kann ich Java sagen: Egal wieviel Whitespaces, füge Taginhalt in EIN Tabellenfeld?


----------



## XHelp (7. Sep 2010)

Und wie machst du das Parsen und wie fügst du zu?


----------



## wdmprojekt (7. Sep 2010)

Ich parse mit Hilfe des Document Builders:


```
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("C:/sample.xml");
```

Anschließend daran definiere ich mir meine auszulesenden Tags:


```
/**
 * Schema:
 * <link name="category">
 * <title></title>
 * <url></url>
 * <created></created>
 * </link>
 */
NodeList n1 = doc.getElementsByTagName("title");
NodeList n2 = doc.getElementsByTagName("url");
NodeList n3 = doc.getElementsByTagName("created");

NodeList listOfLinks = doc.getElementsByTagName("link");
```

Das Hinzufügen realisiere ich mittels Vektoren, da
das XML Dokument in einen jTable integriert wird:


```
String data1 = "", data2 = "", data3 = "";
data = new Vector();
columns = new Vector();
                        
for (int i = 0; i < listOfLinks.getLength(); i++) {
    data1 = n1.item(i).getFirstChild().getNodeValue();
    data2 = n2.item(i).getFirstChild().getNodeValue();
    data3 = n3.item(i).getFirstChild().getNodeValue();

    String line = data1 + " " + data2 + " " + data3;
    
    StringTokenizer st2 = new StringTokenizer(line, " ");
    
    while (st2.hasMoreTokens())
        data.addElement(st2.nextToken());
}

columns.add("");
columns.add("");
columns.add("");
```

Die Integration in das jPanel geschieht so:


```
jScrollPane1 = new JScrollPane();
{						
XMLInJTable t = new XMLInJTable();
jTable1 = new JTable();
jScrollPane1.setViewportView(jTable1);
jTable1.setModel(t);
}
```


----------



## XHelp (7. Sep 2010)

Ohne genauer hinzusehen:
[JAVA=10]
    String line = data1 + " " + data2 + " " + data3;

    StringTokenizer st2 = new StringTokenizer(line, " ");

    while (st2.hasMoreTokens())
        data.addElement(st2.nextToken());
[/code]
Könnte es daran liegen, dass du alles zusammenschmeißt und dann nach Leerzeichen splitest?


----------



## wdmprojekt (7. Sep 2010)

Ja, daran lag es. Habe es mit Semikolon-Trennungen hinbekommen.

Vielen Dank 


```
String line = data1 + ";" + data2 + ";" + data3;
    
StringTokenizer st2 = new StringTokenizer(line, ";");
    
while (st2.hasMoreTokens())
    data.addElement(st2.nextToken());
```


----------



## wdmprojekt (11. Sep 2010)

Nun habe ich ein Folge-Problem:

Ich möchte in der Tabelle lediglich die Einträge mit bestimmter Link-Kategorie:

<JAVA>
/**
 * Schema:
 * <link name="category">
 * <title></title>
 * <url></url>
 * <created></created>
 * </link>
 */
</JAVA>

Wie kann ich das anhand des bestenden Codes umsetzen?


----------



## XHelp (11. Sep 2010)

Schau dir XPath an


----------



## wdmprojekt (11. Sep 2010)

XPath Tutorial

ist zwar gut zu lesen, aber nicht vereinbar mit meinem bestehenden Code... (?),
weil nicht aufgezeigt wird, wie ich "@name" aufzurufen habe...

Heißt es dann:

listOfLinks["@name"] ?

Das wäre für mich logisch, da ich für die Element-Sequenz <link> das
Attribut name anspreche. Dies funktioiniert jedoch leider nicht.


----------



## XHelp (12. Sep 2010)

Was ist listOfLinks?
mit XPath kannst du die Sachen direkt aus der XML filtern. Wenn du es komplett eingelesen hast, dann wäre eine nachträgliche Filterung eine überlegung wert.


----------



## wdmprojekt (12. Sep 2010)

listOfLinks erwähne ich im Kontext meines oben aufgeführten Quellcodes:

NodeList listOfLinks = doc.getElementsByTagName("link");

Ich habe keine Ahnung wie ich die nachträgliche Filterung vornehmen muss... Tipp?


----------



## XHelp (12. Sep 2010)

Mit nachträglicher Filterung meine ich folgendes:
Du speicherst ja irgendwo deine Elemente. Du gehst die durch und wenn deine Kriterien nicht erfüllt sind, dann schmeißt du den Eintrag raus.


----------



## wdmprojekt (12. Sep 2010)

Habe nun eine Lösung gefunden:

Ich übergebe meiner Klasse XMLInJTable die Kategorie als String,
die angezeigt werden soll. Im Anschluss daran folgt eine einfache if-Anweisung.


```
//Main.java
XMLInJTable t = new XMLInJTable("sample1.xml", "category1");

//XMLInJTable.java
if (category.equals(listOfLinks.item(i).getAttributes().getNamedItem("name").getNodeValue().toString())) {
...
}
```


----------

