xml syntax und normalen string ausgeben lassen

darksmilie

Erfahrenes Mitglied
Hi,

Ich lese eine xml datei. Nun kann es passieren das ein normaler string am anfang oder am ende der xmldatei steht.

Ich lese das ganze mit einem Filereader ein und trenne dann den normalen string von der xml syntax. anschließent geben ich die xml syntax in die TransformerFactory um die xml syntax zu erstellen.

Das alles macht mein code wunderbar. Aber leider fehlen dann bei der ausgabe die tabs in der xml syntax, ausschließlich die zeilenumbrüche wurden von der TransformerFactory hinzugefügt.

der xml string, der in die TransformerFactory kommt sieht so aus:
<a> <b> <c name="test"/> </b></a>

in der xml datei steht es so:
Code:
Hallo Welt<a>
  <b>
    <c name="test"/> 
  </b>
</a>
 
Zuletzt bearbeitet:
Hallo,

also ich weiß nicht, hier werden doch Tabs dargestellt, oder hab ich jetzt irgendwas falsch verstanden?

MFG
zEriX
 
ja hast du, so sieht es in der xml datei aus.

meine ausgabe nach dem lesen sieht so aus:
Code:
Hallo Welt
<a>
<b>
<c name="test"/> 
</b>
</a>
 
richtig aber die tabs fehlen mir im auszugegeben String.

Kann es sein das die TransformerFactory ein xml-file anders liesst als ein normalen String?


xml ist doch eigentlich nur ein String oder nicht?

Ich habe ja die vermutung das wenn ich den file mittels BufferReader einlese wichtige informationen für den formater im String verloren gehen.

Wenn ich eine richtige xml datei direkt mit dem formater einlese funktioniert es auch, nur wenn ich ein string vor oder hinter der xml tags habe kriege ich da eine parse exception und kann deswegen dieses direkten weg leider nicht gehen. Also lese ich die datei mittels BufferReader ein und dann macht der der formater keine tabs.

ich poste mal mein code:
Code:
    File db = accountId == null ? new File(Database, FILENAME) : new File(Database, FILENAME);
    if (db.exists()) {
      String output = new String();
      StringBuilder nonXMLBeginning = new StringBuilder();
      StringBuilder nonXMLEnding = new StringBuilder();
      StringBuilder nonXML = new StringBuilder();
      StringBuilder xmlString = new StringBuilder();
      String line;
      BufferedReader reader = new BufferedReader(new FileReader(db));
      while ((line = reader.readLine()) != null) {       
        if(line.indexOf("<") != -1) {
          if(line.indexOf("<") > 0) {
            String beginning = line.substring(0, (line.indexOf("<")));
            if(beginning.charAt(0) != ' ') {
              nonXMLBeginning.append(beginning + "\n");
            }
          }
          String xml = line.substring(line.indexOf("<"),line.length());
          if(xml.indexOf(">") != -1 && (xml.indexOf(">")+1) < xml.length()) {
            String ending = xml.substring((xml.indexOf(">")+1), xml.length());
            if(ending.charAt(0) != ' ') {
              nonXMLEnding.append(ending);
            }
            xml = xml.substring(0,xml.indexOf(">")+1);
          }
          xmlString.append(xml);
        }
        else {
          nonXML.append(line);
        }
      }
      StringBuffer buffer = null;
      if(xmlString.length() > 0) {
        StringWriter writer = new StringWriter();

        Transformer transformer;
        try {
          transformer = TransformerFactory.newInstance().newTransformer();
          transformer.setOutputProperty(OutputKeys.INDENT, "yes");
          transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "1");
          transformer.transform(new StreamSource(new StringReader(xmlString.toString())),new StreamResult(writer));
        } catch (TransformerConfigurationException e) {
          e.printStackTrace();
        } catch (TransformerFactoryConfigurationError e) {
          e.printStackTrace();
        } catch (TransformerException e) {
          e.printStackTrace();
        }
        
        buffer = writer.getBuffer();
      }
      if(nonXMLBeginning.length() > 0) {
        output += nonXMLBeginning.toString();
      }
      if(nonXML.length() > 0) {
        output += nonXML.toString();
      }
      if(buffer != null) {
        output += buffer.toString();
      }
      if(nonXMLEnding.length() > 0) {
        output += nonXMLEnding.toString();
      }
      System.out.println(output);
  }
 
Zuletzt bearbeitet:
Hallo,

ich vermute mal, dass es mit den Tabs nicht so einfach oder gar nicht funktioniert mit den Standard-Sachen. Falls doch möge man mich bitte aufklären wie es funktioniert. Eine Möglichkeit ist es mit JDOM zu lösen und da funktioniert es einwandfrei.

Ich habe ja die vermutung das wenn ich den file mittels BufferReader einlese wichtige informationen für den formater im String verloren gehen.

Welchen Formatter meinst du?

Java:
/**
 *
 */
package de.tutorials.xml;

import java.io.StringReader;
import java.io.StringWriter;

import org.jdom.Document;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.xml.sax.InputSource;

/**
 * 
 */
public class XMLOutputExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		String xml = "<?xml version=\"1.0\"?><a><b><c>xxx</c></b></a>";
		StringWriter writer = new StringWriter();
		SAXBuilder builder = new SAXBuilder();
		Document document = builder.build(new InputSource(new StringReader(xml)));
		
		XMLOutputter outputter = new XMLOutputter();
		outputter.setFormat(Format.getPrettyFormat());
		outputter.output(document,writer);
		
		StringBuffer buffer = writer.getBuffer();
		writer.close();
		System.out.println(buffer.toString());
		
		
	}

}

MFG

zEriX
 
Zuletzt bearbeitet:
Besten Dank zerix,

mit dem XMLOutputter funktioniert es. Es lag also an meinem Transformer, der den xmlString umgewandelt hat.
 
Zurück