# Whitespaces zwischen den Elementen entfernen



## guni (18. Dez 2008)

Hallo,

vorweg: ja, ich habe bereits gesehen, dass es zu diesem Thema tausende Diskussionen im Forum und im Netz gibt; trotzdem kann ich mein Problem nicht lösen.
Ich lese eine JAVA-Datei so ein:

```
InputStream     in     = new FileInputStream( filename ); 
XMLInputFactory fctry  = XMLInputFactory.newInstance(); 
XMLStreamReader p      = fctry.createXMLStreamReader( in );

while (p.hasNext()){
	System.out.println(h.get(p.getEventType())+":\t"+p.getLocalName());
	p.next();
}
```
meine xml sieht derzeit so aus:

```
<?xml version="1.0" encoding="UTF-8"?>
<lesalaire>
    <database>
        <productsxml>../stage/products.xml</productsxml>
        <homedrive>C</homedrive>
        <homename>OraDB10gR2</homename>
    </database>
    <oas>
        <productsxml>../stage/products.xml</productsxml>	
    </oas>
</lesalaire>
```
ich bekomme also das folgende Ergebnis:

```
START_DOCUMENT:	null
START_ELEMENT:	lesalaire
CHARACTERS:	null
START_ELEMENT:	database
CHARACTERS:	null
START_ELEMENT:	productsxml
CHARACTERS:	null
END_ELEMENT:	productsxml
CHARACTERS:	null
START_ELEMENT:	homedrive
CHARACTERS:	null
END_ELEMENT:	homedrive
CHARACTERS:	null
START_ELEMENT:	homename
CHARACTERS:	null
END_ELEMENT:	homename
CHARACTERS:	null
END_ELEMENT:	database
CHARACTERS:	null
START_ELEMENT:	oas
CHARACTERS:	null
START_ELEMENT:	productsxml
CHARACTERS:	null
END_ELEMENT:	productsxml
CHARACTERS:	null
END_ELEMENT:	oas
CHARACTERS:	null
END_ELEMENT:	lesalaire
```
jetzt stört es mich aber, dass die Leerzeichen / Tabs / Newlines nach jedem Element als Characters interpretiert 
werden.

Klar könnte ich ein 

```
if (p.getEventType() == XMLStreamConstants.CHARACTERS) {
	if (p.isWhiteSpace()) continue;
}
```
schreiben; ich hätte diesen Vorgang allerdings gerne schon beim Einlesen der XML abgefangen.

In folgendem Post http://www.java-forum.org/de/viewtopic.php?t=58621&highlight=whitespace schreibt 20mithrandir:


> Du musst zwingend eine DTD verwenden, wenn du Whitespaces ignorieren willst, weil der Parser sonst nicht weiß, was er ignorieren darf und was nicht. So steht's in der API Doku jedenfalls.


das habe ich probiert. Habe mal eine ganz strenge DTD geschrieben:

```
<!ELEMENT lesalaire (database,oas)>
<!ELEMENT database (productsxml,homedrive,homename)>
<!ELEMENT productsxml (#PCDATA)>
<!ELEMENT homedrive (#PCDATA)>
<!ELEMENT homename (#PCDATA)>
<!ELEMENT oas ANY >
```
nur dummerweise ändert das ganze nichts daran, dass ich noch immer meine blöden Characters zwischen den Elementen habe. *Was kann ich da tun?!*

danke, guni


----------



## guni (18. Dez 2008)

anybody here?!


----------



## mikachu (18. Dez 2008)

versuchs mal mit nextTag() anstelle von next()

#Edit 1:
klappt nicht, sobald der auf nen CHARACTERS event trifft, knallts mit ner Exception...

#Edit 2:
ist eigentlich auch klar... siehe APIDocs...
aber zu deinem "Problem" nochmal... das mit den Einrückungen dient ja auch nur der strukturierten Anordnung zur leichteren menschlichen Lesbarkeit. Eigentlich besteht das XML aus keinen Whitespaces zwischen den einzelnen Ende- und Start-Elementen.
Es wird dir also nix weiter übrig bleiben, als das so zu machen, wie du es beschrobest.


----------



## guni (18. Dez 2008)

ja ... genaugenommen knallt er schon früher und zwar beim DTD-Event 
noch irgendwelche anderen Vorschläge?!


----------



## mikachu (18. Dez 2008)

Es gibt auch genügend XML-Tools, welche zwar die Einrückung anzeigen, dann hinten raus aber doch ein XML erstellen, welches keine Einrückungen besitzt.
Wie gesagt... diese dienen lediglich der Lesbarkeit!

Wenn du die reingebaut hast, musst du damit auch leben ;-)

...kannst du machen nix... musst du kucken zu...

#Edit 1:
Und wenn in dem Stream nunmal Whitespaces liegen, werden diese auch mit ausgegeben.
Ein Computer, der seine Gewohnheiten auf die Wünsche des Menschen anpasst, ist leider noch nicht präsent


----------



## guni (18. Dez 2008)

Mir ging es auch nicht daran, ein Programm zu erschaffen, dass seine Gewohnheiten an menschliche Bedürfnisse anpasst. (abgesehen davon ist der Begriff "Gewohnheit" beim Computer wohl ein bisschen weit hergeleitet  :lol: )

nein ... darum geht es nicht.
ich dachte nur, es gäbe eine Möglichkeit die Whitespaces automatisch wegzubekommen.
Oder, mikachu, was sagst du denn zu dem oben geposteten Zitat von 20mithrandir? Laut seiner Aussage müsste der Parser die Whitespaces automatische wegschneiden, wenn die DTD Characters für ein Element verbietet! (wenn ich ihn richtig verstanden habe)

lg, guni


----------



## mikachu (18. Dez 2008)

Wie sich das ganze unter Benutzung eines DTD entwickelt, kann ich dir nicht sagen, da ich keine DTD's nutze.
Wenn ich ein XML validieren will, nutze ich immer XSD's.
XSD's sind IMO verständlicher und besser lesbar (gut, das ist jetzt sehr subjektiv, da ich nur mit solchen arbeite).


----------



## guni (18. Dez 2008)

hallo miakchu,

gut. hab mir xsd mal angeschaut. du hast schon recht: es wirkt auch nicht so schwierig.
hab mir oxygen downgeloaded (XSD und DTD kenne ich seit heute!) und mir mal eine XSD erstellt:


```
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="lesalaire">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="database" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="productsxml" type="xs:string" />
                            <xs:element name="homedrive" type="xs:string" />
                            <xs:element name="homename" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="oas" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="productsxml" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
```

na ja - da seh ich jetzt aber auch nicht viel von validierung ...
hab im XML undefiniertes element hinzugefügt; der Parser rennt trotzdem brav durch und interessiert sich null für das xsd.

2 Fragen off-Topic:

die Einbindung des XSD in das XML habe ich wie folgt geschrieben:

```
<lesalaire xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema.xsd">
```

im XSD steht auch folgende Zeile:

```
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
```

in beiden Fällen ist eine Web-Adresse angegeben. Kann das XSD / das XML also nur validiert werden, wenn der Rechner im Netz hängt?!

gibt es irgendeinen guten Freeware-XML-Editor? Oxygen scheint auf 30-Tage-Trial beschränkt zu sein ...


----------



## Murray (18. Dez 2008)

guni hat gesagt.:
			
		

> in beiden Fällen ist eine Web-Adresse angegeben. Kann das XSD / das XML also nur validiert werden, wenn der Rechner im Netz hängt?!


Nein, die URL dient nur als eindeutiger Name.


----------



## mikachu (19. Dez 2008)

Ob es iwo einen guten XML Editor gibt, kann ich dir nicht sagen.
Ich komm da von der OldSchool und schreibe alles mit Notepad.
Manchmal auch mit Eclipse (automatische End-Element-Generierung, oder wie sich das Feature nennt, eingeschalten).

Nimm doch einfach die Zeilenumbrüche aus der XML raus!

Schon hat sich das "Problem" wie von selbst gelöst ;-)

#Edit 1:
Desweitern ist das Validieren auch nur eine syntaktische und keine strukturelle Prüfung! Die Whitespaces zwischen den Ende- und Start-Elementen werden da einfach ignoriert :!: (denk ich mal so)
Ferner ist eine Validierung auch nur eine genaue Definition für spätere Programme/Schnittstellen, die ein XML entgegennehmen.


----------



## guni (19. Dez 2008)

Guten Morgen:

@Murray:


> Nein, die URL dient nur als eindeutiger Name.


d.h. ich könnte da genausogut eine nicht-existierende Web-Adresse angeben?!
oder irgendeinen Namen der auf meinem Rechner eindeutig ist?!

@Mikachu:


> Nimm doch einfach die Zeilenumbrüche aus der XML raus!


klar. das kann ich machen. ich kann genausogut in meinem Parser abfangen, ob mein getText eines Character-Events nur Whitespaces zurückgibt und es dann überspringen.
All das ist möglich. Mir geht es aber nicht vordergründig darum, irgendeinen Workaround zu finden; es muss doch möglich sein, dem Parser in irgendeiner Form zu sagen, dass bestimmte Whitespaces nur formatierungsbedingt vorhanden sind und deswegen ignoriert werden sollen.
Lt. Aussagen in anderen Foren "überspringt" der Parser diese Events, wenn ein Schema in die XML-Datei eingebunden ist. Habe das sowohl mit DTD als auch mit XSD probiert. Der Parser scheint ein Schema jedoch vollständig zu ignorieren; sonst könnte er undefinierte Elemente in der XML doch gar nicht erlauben! Wie kann ich ein validiertes Parsing ermöglichen?!

lg, guni


----------



## mikachu (19. Dez 2008)

Um letztere Annahme bestätigen zu können, kannst du ja mal eine kleine Änderung in dem XSD vornehmen, sodass der Prozess des Validierens auf jeden Fall fehlschlagen muss.

Sonst hab ich da auch keine weiteren Vorschläge... Sorry


----------



## guni (19. Dez 2008)

> kannst du ja mal eine kleine Änderung in dem XSD vornehmen, sodass der Prozess des Validierens auf jeden Fall fehlschlagen muss.



genau das habe ich getan. aber mein parser parst munter weiter. deswegen wollte ich ja wissen, ob ich das irgendwie noch einstellen muss / kann, dass das XML beim Parsen validiert wird.


----------



## mikachu (19. Dez 2008)

Guggst du hier: THE SCHEMA VALIDATION FRAMEWORK
Dort steht alles schön beschrieben :###


----------



## guni (19. Dez 2008)

oh Mann! Ist das alles kompliziert.
Ich hätte gehofft, dass es da irgendeinen Parameter im Parser zu setzen gibt und dann passt das mit den Whitespaces.


... hat noch irgendwer eine Idee dazu?!


----------

