Whitespaces zwischen den Elementen entfernen

Status
Nicht offen für weitere Antworten.

guni

Bekanntes Mitglied
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:
Code:
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:
Code:
<?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:
Code:
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
Code:
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:
Code:
<!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
 

mikachu

Top Contributor
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

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

mikachu

Top Contributor
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 :cool:
 

guni

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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:

Code:
<?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:
    Code:
    <lesalaire xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="schema.xsd">

    im XSD steht auch folgende Zeile:
    Code:
    <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 ...
 

mikachu

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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.
 

guni

Bekanntes Mitglied
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?!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben