# Hilfe: Bekomme statt '>'  '&gt;' .



## nebulo (28. Mai 2007)

Hallo,

ich habe folgendes Problem. Ich will ein XML Document (JDOM) als String haben. Also verwende ich folgende Methode:


```
public static String getFormattedXMLString(Document doc) throws IOException {
		StringWriter strw = new StringWriter();
		XMLOutputter out = new XMLOutputter();
		out.output(doc, strw);	
		return strw.toString();
}
```

soweit so gut. Nun wird der Inhalt eines Childs des XML-Documents vorher mit folgender Methode "behandelt":


```
public static String bbCode2HTML(String bbCode) {

		/* replace [b] by <p class="bold"> */
		bbCode = bbCode.replaceAll("\\[b\\]", "<p class=\"bold\">");
		/* replace [/b] by </p> */
		bbCode = bbCode.replaceAll("\\[/b\\]", "</p>");

		/* replace [i] by <p class="italic"> */
		bbCode = bbCode.replaceAll("\\[i\\]", "<p class=\"italic\">");
		/* replace [/i] by </p> */
		bbCode = bbCode.replaceAll("\\[/i\\]", "</p>");

                .....
}
```

genau in den Inhalt dieses Elements gibt mir danach getFormattedXMLString(...) aus mit '&' statt '>' und '&' statt '<' hat jemand eine Idee wie ich das unterdrücken kann? Brauche das dringend mit '<' und '>' .

Gruß nebulo


----------



## EOB (29. Mai 2007)

und du meinst, es liegt an der methode bbCode2HTML?


----------



## SnooP (29. Mai 2007)

naja ... & bzw. & sind die Escapes für > bzw. < - sie würden also im Browser erstmal korrekt dargestellt werden...
musst du denn die noch händisch wieder anfassen? Was spricht dagegen auf gt bzw. lt zu prüfen? statt auf < oder >?


----------



## nebulo (29. Mai 2007)

Also es ist tatsächlich nur der Teil auf den ich die bbCode2HTML anwende bei dem nachher die < durch '& l t ;' und > '& g t ;' dargestellt werden. 

Das komische ist, dass ich letztendlich aus der XML per XSLT eine html transformiere und das Ergbenis, dass ich auf die Platte schreibe sieht folgender maßen aus. 


```
<?xml version="1.0" encoding="UTF-8"?>
<html>
  <head>
    <link href="datum.css" rel="stylesheet" type="text/css" />
    <link href="titelblack.css" rel="stylesheet" type="text/css" />
    <link href="bbCode.css" rel="stylesheet" type="text/css" />
  </head>
  <body alink="#990000" bgcolor="#cecbce" leftmargin="0" link="#000000" marginheight="0" marginwidth="0" text="#000000" topmargin="0" vlink="#000000">
    [img]./redpoint.gif[/img]
    <span class="datum">23.05.2007</span>
    <p class="titelblack">Neues Dokument zum testen</p>
    

    
    Das ist ein ganz normaler Text&br&Dies ist ein &p class="bold"&fetter Text&/p&&br&Dieser hier ist &p class="underlined"&unterstrichen&/p&&br&Das ist &a href="http://www.google.de" target=_blank&ein link&/a&
  </body>
</html>
```

Hier werden gt; und lt; leider verschluckt stehen überall dort wo ein & steht
Verstehe das nicht und selbst der Firefox zeigt nachher die '& g t ;' '& l t ;' an.


----------



## kleiner_held (29. Mai 2007)

So wie du den Inhalt von JDOM Elementen den Text modifizierst, versuchst du ja im Endeffekt neue XHTML Elemente einzufuegen. JDOM kann das aber bei einer simplen Textersetzung nicht erkennen - alles was als Text-Content in einem Element steht wird von JDOM korrekt maskiert, also alle < werden zu & g t ; usw.
Du kannst also entweder erst nachdem du mit JDOM das Dokument in einen String transformiert hast, die Ersetzung vornehmen. Oder du musst eine etwas komplexere Ersetzungsmethode implementieren, die die erzeugten html tags als neue Elemente im JDOM Elementbaum einfuegt.


----------



## nebulo (29. Mai 2007)

Vielen Dank! Eigentlich hätte ich da auch selber drauf kommen können ^^.

Ich weiß gehört jetzt eigentlich in XML ... , aber ist es nicht möglich mit SAXBuilder o.Ä. einfach den String zu parsen sowie das bei einem ganzen Dokument auch geht mit:


```
String xml = "....";
SAXBuilder builder = new SAXBuilder();
StringReader reader = new StringReader(xml);
Document doc = builder.build(reader);
```


----------



## kleiner_held (29. Mai 2007)

Ja das sollte gehen. 
Ich wuerde den String noch in ein XML tag einfassen, um sicherzustellen, dass nur ein Wurzelelement existiert. Also 

```
String xml  = "<root>" + meinStringMitErsetztenBBCodeTags + "</root>";
```
Nach dem Parsen hast du dann ein ein Document mit genau einem Wurzelelement, und alles unterhalb des Wurzelelements, kannstdu dann an der urspruengliche Stelle in deinem orginalen Elementbaum einfuegen.


----------



## nebulo (29. Mai 2007)

Danke! Genau das versuche ich zu machen aber ich mache wohl irgendetwas falsch. 

Ich versuche folgendes: 


```
String bbCodeParsed = "<root>"+BBCodeParser.bbCode2HTML(getContent())+"</root>";
SAXBuilder builder = new SAXBuilder();
StringReader reader = new StringReader(bbCodeParsed);
Document parsedDocument = builder.build(reader);
Element parsedRoot = parsedDocument.getRootElement();
List childs = parsedRoot.getChildren();
contentxml.removeContent();
contentxml.addContent(childs);
```

wobei contentxml das Element des originalen Documents ist.

Bekomme dann immer:

org.jdom.IllegalAddException: The Content already has an existing parent "root" - Zeile 9 wirft diese Exception


----------



## kleiner_held (29. Mai 2007)

mach mal aus Zeile 7 gleich ein 

```
List childs = parsedRoot.removeContent();
```
 Das gibt die childs die entfernt wurden zurueck und die duerften dann keinen parent mehr gesetzt haben.


----------



## nebulo (29. Mai 2007)

Vielen Dank! Jetzt funktioniert das einfügen zwar aber es gibt trotzdem ein Problem:

wenn ich mit der oben dokumentierten XMLService.getFormattedXMLString(...) das transformierte Document in einen String umwandle und diesen ausgebe dann ist alles in Ordnung! 

Wenn ich dann aber mit 


```
public static Document transfromXML(Document source, File xslStylesheet)
		XSLTransformer transformer = new XSLTransformer(xslStylesheet);
		Document docTrans = transformer.transform(source);
		return docTrans;
}
```

Das Document transfomiere sind alle tags des Elements, dass ich ausgetauscht habe weg. An dieser stelle wird nur der Text angezeigt.


----------



## kleiner_held (29. Mai 2007)

hmm ich tippe mal das es am XSL Stylesheet liegt.


----------



## nebulo (29. Mai 2007)

Korrekt - vielen Dank! Jetzt muss ich mal darüber nachdenken wie ich das ganze löse.

EDIT: Ich habe nun eine schmutzige Lösung gefunden. Wer ähnliche Probleme hat und bei seiner Suche auf dieses Thema stößt kann sich gerne bei mir per pn melden.

Gruß nebulo


----------

