XMLSerializer Darstellungsproblem

crypt85

Grünschnabel
Hallihallo. Ich habe ein Problem mit dem parsen einer XML-Datei. Sorry, wenn es sich um ein Newb-Problem handelt. Aber ich bin schon ewig am Suchen und werde einfach nicht fündig, wo mein Fehler liegt.

Folgende Problemstellung:
Es liegen XML-Dokumente in unterschiedlicher Formatierung vor. Diese kann sowohl einzeilig als auch bereits vorformatiert sein. Ich nutze einen XMLParser mit einem beigefügten ContentHandler, welcher wiederum eine Instanz des XML-Serializers erzeugt und aufruft. Ein LexicalHandler sorgt dafür, dass auch Kommentare richtig erkannt werden. Das Ergebnis soll (testweise) nur auf der Konsole ausgegeben werden.

Ziel:
Durch das ganze Prozedere soll das XML-File unbeachtet der vorliegenden Formatierung, formschön dargestellt werden. Damit meine ich z.B. das korrekte Einrücken von Elementen, so dass Anfangs- und Endtags untereinander sind und Unterelemente einen Zeilenvorschub vor ihren Oberelementen erhalten.

Problem:
Bei innerhalb der Tags zu initalisierenden Attributen und anderen Unvorhersehbarkeiten (z.B. Namespaces) wird der XML-Code anscheinend vollkommen willkürlich auf dem Ausgabefeld verteilt angezeigt.
Es gibt bloß zwei Möglichkeiten, dass dieser korrekt angezeigt wird.
1. Die Ausgabedatei beinhaltet eine DTD, welche den korrekten Aufbau der einzelnen Elemente spezifiziert.
2. Die Ausgabedatei ist einzeilig und beinhaltet keine Leerzeichen zwischen den Tags.
Das Problem ist jetzt, dass die Dateien, die später geparst werden sollen, leider keine DTD enthalten. Ich habe mir den Sourcecode des XMLSerializer angesehen und eigentlich müsste dieser Dinge wie Namespaces erkennen und keine nicht vorhandenen Zeilenvorschübe einbauen.

Hab ich da irgendwie einen programmiertechnischen Fehler drin oder muss ich die Klasse XMLSerializer redefinieren, damit die Methoden nach meinen Wünschen funktionieren?
Bitte nehmt's mir nicht übel, wenn ich den ein oder anderen Begriff verwechsele. Ich bin auf dem Gebiet Java noch ziemlich unbefangen.

Vielen vielen Dank im Voraus, Leute.

Meine Main
Java:
.....
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
public class CopyOfMain {
	
	public static void main(String[] args) throws SAXException {
		
	
		StringWriter buffer = new StringWriter();
		
		XmlHandler handler = new XmlHandler(buffer);
		
		SAXParserFactory factory = SAXParserFactory.newInstance();

		try {
			
			factory.setValidating(false);

			
			XMLReader saxParser = factory.newSAXParser().getXMLReader();

			saxParser.setProperty("http://xml.org/sax/properties/lexical-handler",
					handler.getSerializer()
					);
			
			saxParser.setContentHandler(handler);

			saxParser
					.parse("file:///C:/Dokumente und Einstellungen/NoName/Desktop/Aktuell/Abteilungen/070416/070417_XML/XML.xml");
		} catch (ParserConfigurationException ex) {
			System.out.println(ex);
		} catch (SAXParseException ex) {
			
			handler.getCuttedXml();
			
			System.out.println("SAXParseException:, Zeile "
					+ ex.getLineNumber() + ", Spalte " + ex.getColumnNumber()
					+ ":");
			System.out.println(ex);
		} catch (SAXException ex) {
			
			System.out.println("SAXException: ");
			if (null != ex.getException()) {
			System.out.println("geschachtelte Exception: ");
			System.out.println(ex.getException().getMessage());
			} else {
				System.out.println(ex);
			}
		} catch (IOException ex) {
			System.out.println(ex);
		}
		
		System.out.println(buffer.toString());

	}
}

Mein Contenthandler
Java:
import java.io.Writer;

import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;


public class CopyOfXmlHandler implements ContentHandler
{
  
   
  private XMLSerializer serializer;
   
  public CopyOfXmlHandler(Writer bufferout)
  {
	  serializer = new XMLSerializer(bufferout, new OutputFormat("xml", "iso-8859-1", true));
  }
   
  
  public void startDocument() throws SAXException
  {
	  serializer.startDocument();    
  }

  
  public XMLSerializer getSerializer(){
	  return serializer; 
  }
  
  public void getCuttedXml() throws SAXException{
	  this.endDocument();
  }

  public void startElement( String namespaceURI,
                            String sName,
                            String qName,
                            Attributes attrs ) throws SAXException
  { 
    serializer.startElement(namespaceURI, sName, qName, attrs); 
  }

  public void endElement( String namespaceURI,
                         String sName,
                         String qName  ) throws SAXException
  {
     
	String name = qName;
    if( name.equals( "" ) )
    {
      name = sName;
    }
    serializer.endElement(namespaceURI, sName, qName);
  }
     
  public void characters( char [] ch, int start, int length )
  throws SAXException
{
	  serializer.characters(ch, start, length);
}
  
  public void error( SAXException ex ) throws SAXException
  {
    throw ex;
  }

public void endDocument() throws SAXException {
   serializer.endDocument();
   
}

public void endPrefixMapping(String prefix) throws SAXException {
   // TODO Auto-generated method stub
   
}

public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
   
}

public void processingInstruction(String target, String data) throws SAXException {
   // TODO Auto-generated method stub
   
}

public void setDocumentLocator(Locator locator) {
   // TODO Auto-generated method stub
   
}

public void skippedEntity(String name) throws SAXException {
   // TODO Auto-generated method stub
   
}

public void startPrefixMapping(String prefix, String uri) throws SAXException {
   // TODO Auto-generated method stub

  
   }
}

Ausgangslage der zu parsenden XML-Datei
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Hallo xmlns:html="http://www.w3.org/TR/REC-html40">
<Ausgabe>XML</Ausgabe>
<html:h2>Eine Überschrift mit HTML </html:h2>
<body>
  <table border="1">
    <tr>
      <html:th align="left">"Title"</html:th>
      <html:th align="left">"Artist"</html:th>
    </tr>
    <tr>
      <td><html:value-of select="title"/></td>
      <td><html:value-of select="artist"/></td>
    </tr>
  </table>
</body>
</Hallo>

Die Ausgabedatei mit sehr eigenartiger Formatierung
XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<Hallo
            xmlns:html="http://www.w3.org/TR/REC-html40">
<Ausgabe>XML</Ausgabe>
<html:h2>Eine Überschrift mit HTML </html:h2>
<body>
  <table
                    border="1">
    <tr>
      <html:th
                    align="left">"Title"</html:th>
      <html:th align="left">"Artist"</html:th>
    </tr>
    <tr>
      <td>
                    <html:value-of select="title"/>
                </td>
      <td>
                    <html:value-of select="artist"/>
                </td>
    </tr>
  </table>
</body>
</Hallo>
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück