Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

XML-Datei einlesen

48 views
Skip to first unread message

Laura Schmidt

unread,
Jan 24, 2013, 10:49:43 PM1/24/13
to
Hallo,

ich lese mit javax.xml.parsers.DocumentBuilder XML-Dateien ein, die im
Inneren sowas enthalten:

<Group name="Urlaub 2005" date="11/2005">

<Synopsis>
Das war der Urlaub.
Der Urlaub war sch�n.
</Synopsis>

...
</Group>


Das sieht im Inneren dann so aus:

private void loadGroupContent (Group grp,Node node)
{
NodeList lst = node.getChildNodes();

for (int i = 0;i < lst.getLength();i++)
{
Node n = lst.item(i);

if (n.getNodeName() == "Synopsis")
{
grp.synopsis = n.getTextContent();

continue;
}
...
}
}

Der Inhalt des Knotens "Symopsis" wird in einem generierten
HTML-Dokument ausgegeben.

Soweit, so gut.

Nun m�chte ich aber innerhalb des Textes in "Synopsis" Zeilenumbr�che
einf�gen. Das Einf�gen von "<br>" f�hrt nat�rlich zum Parser-Fehler,
aber das Einf�gen von "<br/>" bringt es auch nicht:

<Synopsis>
Das war der Urlaub.<br/>
Der Urlaub war sch�n.
</Synopsis>

Der Text enth�lt dann an der Stelle ein "\n". Dies enth�lt er aber auch
an anderen Stellen:

"\n Das war der Urlaub.\n Der Urlaub war sch�n.\n"

Das hei�t, bei der Generierung des HTML-Codes einfach alle "\n" in
"<br>" umzuwandeln f�hrt auch nicht zum Ziel.

Mir ist klar, dass der XML-Parser das br-Tag explizit zur Zerlegung
verwendet und nicht einfach nur an Node.getTextContent "durchreicht".

Wie macht man das am besten?

Danke!

Gr��e
Laura

ma...@heinerkuecker.de

unread,
Jan 25, 2013, 6:58:21 AM1/25/13
to
Laura Schmidt schrieb:
> ich lese mit javax.xml.parsers.DocumentBuilder XML-Dateien ein, die im
> Inneren sowas enthalten:
> <Group name="Urlaub 2005" date="11/2005">
> <Synopsis>
> Das war der Urlaub.
> Der Urlaub war schön.
> </Synopsis>
> Der Inhalt des Knotens "Symopsis" wird in einem generierten
> HTML-Dokument ausgegeben.
> Soweit, so gut.
> Nun möchte ich aber innerhalb des Textes in "Synopsis" Zeilenumbrüche
> einfügen.

Im Quell-XML oder im Ziel-HTML?

> Das Einfügen von "<br>" führt natürlich zum Parser-Fehler,

Welcher Parser? XML-Parser oder der spätere HTML-Parser?

> aber das Einfügen von "<br/>" bringt es auch nicht:
> <Synopsis>
> Das war der Urlaub.<br/>
> Der Urlaub war schön.
> </Synopsis>
> Der Text enthält dann an der Stelle ein "\n". Dies enthält er aber auch
> an anderen Stellen:
> "\n Das war der Urlaub.\n Der Urlaub war schön.\n"
> Das heißt, bei der Generierung des HTML-Codes einfach alle "\n" in
> "<br>" umzuwandeln führt auch nicht zum Ziel.

Hier ein vorheriges String.trim() helfen, denn \n ist eine weisses Zeichen,
welches durch trim am Anfeng und Ende entfernt wird.

> Mir ist klar, dass der XML-Parser das br-Tag explizit zur Zerlegung
> verwendet und nicht einfach nur an Node.getTextContent "durchreicht".

Ersetzt Du das \n im XML-Quell-Dokument vor dem Parsen durch den XML-Parser?
Die Ersetzung kann nach dem Parsen im String, welcher vom XML-Parser geliefert wurde, erfolgen.

> Wie macht man das am besten?
> Danke!
> Grüße
> Laura

Grüße
Heiner

Patrick Roemer

unread,
Jan 25, 2013, 7:37:53 AM1/25/13
to
Responding to Laura Schmidt:

> if (n.getNodeName() == "Synopsis")
> {
> grp.synopsis = n.getTextContent();
>
> continue;
> }
[...]
> Nun möchte ich aber innerhalb des Textes in "Synopsis" Zeilenumbrüche
> einfügen. Das Einfügen von "<br>" führt natürlich zum Parser-Fehler,
> aber das Einfügen von "<br/>" bringt es auch nicht:
>
> <Synopsis>
> Das war der Urlaub.<br/>
> Der Urlaub war schön.
> </Synopsis>

Das <br/> duerfte ueberhaupt keinen Effekt haben, schon weil es fuer
einen XML-Parser keine spezielle Bedeutung hat. #getTextContent() gibt
Dir nur den reinen Text (inklusive der Umbrueche) und ignoriert die
XML-Tags "dazwischen".

Du kannst die einzelnen Zeilen extrahieren, indem Du den via
#getTextContent() erhaltenen String mit trim/split auseinanderpflueckst.
Dann musst Du halt, wo/wie immer Du auch HTML generierst, dazwischen
br-Tags einfuegen.

Alternativ koenntest Du natuerlich auch im Original-XML <br/> oder
beliebige eigene Elemente fuer Zeilen(-umbrueche) einfuehren - die
muesstest Du dann aber auch explizit unterhalb des Synopsis-Tags
behandeln. (Bzw. koenntest Du dann im Prinzip auch abwaegen, ob nicht
ggfs. eine XML-Transformation bequemer waere, als alles per Java-API aus
dem DOM rauszupfriemeln.)

BTW, XPath koennte auch angenehmer sein, als das DOM explizit zu
traversieren.

Viele Gruesse,
Patrick

Laura Schmidt

unread,
Jan 25, 2013, 8:28:17 AM1/25/13
to
On 01/25/2013 01:37 PM, Patrick Roemer wrote:
> Responding to Laura Schmidt:

>> <Synopsis>
>> Das war der Urlaub.<br/>
>> Der Urlaub war schön.
>> </Synopsis>
>
> Das <br/> duerfte ueberhaupt keinen Effekt haben, schon weil es fuer
> einen XML-Parser keine spezielle Bedeutung hat. #getTextContent() gibt
> Dir nur den reinen Text (inklusive der Umbrueche) und ignoriert die
> XML-Tags "dazwischen".
>
> Du kannst die einzelnen Zeilen extrahieren, indem Du den via
> #getTextContent() erhaltenen String mit trim/split auseinanderpflueckst.
> Dann musst Du halt, wo/wie immer Du auch HTML generierst, dazwischen
> br-Tags einfuegen.

Ja, aber genau das ist problematisch, weil nicht nur anstelle der
<br>-Tags ein "\n" eingefügt wird, sondern auch an vielen anderen
Stellen, je nachdem, wo im Quell-XML Newlines sind.

> Alternativ koenntest Du natuerlich auch im Original-XML <br/> oder
> beliebige eigene Elemente fuer Zeilen(-umbrueche) einfuehren - die
> muesstest Du dann aber auch explizit unterhalb des Synopsis-Tags
> behandeln.

Wie denn? So?

NodeList lst = node.getChildNodes();

for (int i = 0;i < lst.getLength();i++)
{
Node n = lst.item(i);

if (n.getNodeName() == "br")
...

So käme ich an die beabsichtigten Newlines. Und wie käme ich an den Text
dazwischen?


> (Bzw. koenntest Du dann im Prinzip auch abwaegen, ob nicht
> ggfs. eine XML-Transformation bequemer waere, als alles per Java-API aus
> dem DOM rauszupfriemeln.)
>
> BTW, XPath koennte auch angenehmer sein, als das DOM explizit zu
> traversieren.

Klingt gut. Hättest Du ein Code-Schnipsel?

Viele Grüße
Laura

Patrick Roemer

unread,
Jan 25, 2013, 11:00:30 AM1/25/13
to
Responding to Laura Schmidt:
> On 01/25/2013 01:37 PM, Patrick Roemer wrote:
>
>> Du kannst die einzelnen Zeilen extrahieren, indem Du den via
>> #getTextContent() erhaltenen String mit trim/split auseinanderpflueckst.
>> Dann musst Du halt, wo/wie immer Du auch HTML generierst, dazwischen
>> br-Tags einfuegen.
>
> Ja, aber genau das ist problematisch, weil nicht nur anstelle der
> <br>-Tags ein "\n" eingef锟絞t wird, sondern auch an vielen anderen
> Stellen, je nachdem, wo im Quell-XML Newlines sind.

Wie Heiner bereits schrieb: Wenn nur die Umbrueche zu Beginn und Ende
des Textausschnitts das Problem sind, koennen die per #trim() entfernt
werden-

> NodeList lst = node.getChildNodes();
>
> for (int i = 0;i < lst.getLength();i++)
> {
> Node n = lst.item(i);
>
> if (n.getNodeName() == "br")
> ...
>
> So k锟絤e ich an die beabsichtigten Newlines. Und wie k锟絤e ich an den Text
> dazwischen?

if(n.getNodeType() == Node.TEXT_NODE) {
// ...
}

>> (Bzw. koenntest Du dann im Prinzip auch abwaegen, ob nicht
>> ggfs. eine XML-Transformation bequemer waere, als alles per Java-API aus
>> dem DOM rauszupfriemeln.)
>>
>> BTW, XPath koennte auch angenehmer sein, als das DOM explizit zu
>> traversieren.
>
> Klingt gut. H锟絫test Du ein Code-Schnipsel?

XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression synExp = xpath.compile("//Group/Synopsis");
NodeList synResult =
(NodeList)synExp.evaluate(rootNode, XPathConstants.NODESET);
XPathExpression txtExp = xpath.compile("break|child::text()");
// ueber synResult iterieren und txtExp auf jeder Node evaluieren,
// dann wiederum ueber dieses Ergebnis iterieren und je nachdem,
// ob es TEXT_NODE oder <break/> ist, behandeln.

Keine Ahnung, ob das fuer Deinen Anwendungsfall wirklich bequemer ist.
Und ich bin mir nicht 100% sicher, dass bei dem "|" garantiert ist, dass
die Nodes in ihrer Ursprungsreihenfolge rauskommen - muesste man noch
mal nachschlagen.

Was XSLT/Transformer angeht, muesstest Du selber mal nachgooglen, da
habe ich nix parat.

Auf jeden Fall ist XML-Verarbeitung mit der Java-Standard-API mit viel
Boilerplatetipperei verbunden. Wenn man das oefter machen will, tut man
sicher gut daran, fruehzeitig Drittbibliotheken anzuschauen oder sich
eigene kleine Wrapper-APIs zu schreiben, um die Schmerzen etwas zu mildern.

Viele Gruesse,
Patrick

Maxim Webster

unread,
Jan 26, 2013, 3:04:19 AM1/26/13
to
Am 25.01.2013 04:49, schrieb Laura Schmidt:

> Wie macht man das am besten?

mit dem CSS-Attribut "white-space: pre" auf dem generierten HTML
<Synopsis> Element.

Gru�,
Maxim

ma...@heinerkuecker.de

unread,
Jan 26, 2013, 5:40:54 AM1/26/13
to
Laura Schmidt schrieb:
> if (n.getNodeName() == "br")

Achtung: Strings und andere Objekte immer mit equals vergleichen

if (n.getNodeName().equals( "br" ) )


> Viele Grüße
> Laura

Grüße
Heiner

KranzKrone

unread,
Mar 12, 2013, 4:58:46 AM3/12/13
to
Hallo Laura,

für mich sieht das wie ein Encoding-Problem aus. Vielleicht verwendet du einfach das falsche Charset. Die JVM Arbeitet mit UTF-16 intern und extern mit UTF-8. XML Dateien können aber in CP-1252 gespeichert sein.

Du kannst deine Dateien in UTF 8 speichern (Window´s Editor oder etc.) und vielleicht solltest du im Kopf das Charset mit angegben.

<?xml version="1.0" encoding="UTF-8">
<deinetags />

Das Problem hierbei ist, das man nur Charset raten kann und nicht bestimmen, UTF 8 fast genausone Bits hat wie ASCII.

Hast du schon SAX für Java ausprobiert?

Grüße Krone

Patrick Roemer

unread,
Mar 12, 2013, 4:29:22 PM3/12/13
to
Responding to KranzKrone:

> für mich sieht das wie ein Encoding-Problem aus.

Na, dann aber mal ab zum Optiker. ;)

Viele Gruesse,
Patrick

0 new messages