[o.0]
Lt. Commander
- Registriert
- Apr. 2008
- Beiträge
- 1.056
Hallo,
ich schreibe im Moment einen Parser der mir meine Verläufe von Miranda nach Pidgin rettet. Dazu exportiere ich die Verläufe in Miranda im XML Format und lese sie mit einem Java Programm ein, das daraus die entsprechenden HTML Dokumente erstellt und abspeichert. Das klappt soweit auch alles wunderbar, allerdings habe ich noch mindestens ein kleineres Problem dabei.
Aus unerfindlichen Gründen sind in den XML Dateien allerdings diverse Zeichen enthalten, die in einer XML eigentlich nichts zu suchen haben:
Google spuckt aus, dass es sich bei diesem Zeichen um "EOT (End of Transmission)" handelt und das wirklich nichts darin verloren hat. Diverse Lösungen gab es natürlich auch, aber Lösungsansätze wie die Ausgabe des XML-erstellenden Programmes zu korrigieren gehen in meinem Fall natürlich nicht.
Dabei schmiert dann natürlich das komplette Programm ab. Klar, ich könnte einfach vor dem Einlesen alle .xml Dateien nach diesem Unicode Zeichen durchsuchen und es ggf löschen, allerdings muss das bei >200MB Dateien nicht unbedingt sein. Und eine elegante Variante wäre mir natürlich lieber
Hat jemand eine Idee wie ich das Problem lösen könnte?
Die entsprechende Klasse meines Programmes sieht so aus, die relevante Stelle beim Einlesen der Nachricht beginnt bei Zeile 92.
[edit]
Die Struktur der XML, falls benötigt:
[/edit]
Ich wäre für jede Hilfe dankbar.. und ja, die Methode ist glaube ich suboptimal geschrieben, allerdings ist es das erste Mal das ich etwas mit XML mache und ich bin schon froh das es überhaupt läuft
ich schreibe im Moment einen Parser der mir meine Verläufe von Miranda nach Pidgin rettet. Dazu exportiere ich die Verläufe in Miranda im XML Format und lese sie mit einem Java Programm ein, das daraus die entsprechenden HTML Dokumente erstellt und abspeichert. Das klappt soweit auch alles wunderbar, allerdings habe ich noch mindestens ein kleineres Problem dabei.
Aus unerfindlichen Gründen sind in den XML Dateien allerdings diverse Zeichen enthalten, die in einer XML eigentlich nichts zu suchen haben:
Code:
[Fatal Error] test4.xml:53154:11: An invalid XML character (Unicode: 0x4) was found in the element content of the document.
Dabei schmiert dann natürlich das komplette Programm ab. Klar, ich könnte einfach vor dem Einlesen alle .xml Dateien nach diesem Unicode Zeichen durchsuchen und es ggf löschen, allerdings muss das bei >200MB Dateien nicht unbedingt sein. Und eine elegante Variante wäre mir natürlich lieber
Hat jemand eine Idee wie ich das Problem lösen könnte?
Die entsprechende Klasse meines Programmes sieht so aus, die relevante Stelle beim Einlesen der Nachricht beginnt bei Zeile 92.
Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
/**
*
* @author max
*/
public class parser {
public messages parse(String datei, Statistik Stats)
{
// Rückgabe Objekt
messages Messages = new messages();
try
{
// Alle nötigen Objekte erstellen
File file = new File(datei);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbFactory.newDocumentBuilder();
Document document = db.parse(file);
document.getDocumentElement().normalize();
NodeList nodeL = document.getElementsByTagName("EVENT");
int anzahlEvents = nodeL.getLength();
// Statistik aktualisieren..
Stats.aktMessagesBearbeitet(anzahlEvents);
// Arrays zum Zwischenspeichern der Daten
String[] fromA = new String[anzahlEvents];
String[] timeA = new String[anzahlEvents];
String[] dateA = new String[anzahlEvents];
String[] idA = new String[anzahlEvents];
String[] messageA = new String[anzahlEvents];
for (int i = 0; i < anzahlEvents; i++)
{
Node firstNode = nodeL.item(i);
if (firstNode.getNodeType() == Node.ELEMENT_NODE)
{
Element element = (Element) firstNode;
if(i == 0) // Nur beim ersten Event nötig da sich die Werte innerhalb einer Datei nicht ändern
{
// Name des Kontaktes
NodeList contactElemntList = element.getElementsByTagName("CONTACT");
Element contactElement = (Element) contactElemntList.item(0);
NodeList contact = contactElement.getChildNodes();
// Protokoll über das die Nachricht verschickt wurde, zB "MSN"
NodeList protocolElementList = element.getElementsByTagName("PROTOCOL");
Element protocolElement = (Element)
protocolElementList.item(0);
NodeList protocol = protocolElement.getChildNodes();
Messages.setContact(contact.item(0).getNodeValue());
Messages.setProtocol(protocol.item(0).getNodeValue());
}
// Name des Senders der Nachricht
NodeList fromElementList = element.getElementsByTagName("FROM");
Element fromElement = (Element)
fromElementList.item(0);
NodeList from = fromElement.getChildNodes();
// Uhrzeit der Nachricht, zB "21:39:46"
NodeList timeElementList = element.getElementsByTagName("TIME");
Element timeElement = (Element)
timeElementList.item(0);
NodeList time = timeElement.getChildNodes();
// Datum der Nachricht, zB "2011-10-13"
NodeList dateElementList = element.getElementsByTagName("DATE");
Element dateElement = (Element)
dateElementList.item(0);
NodeList date = dateElement.getChildNodes();
// Adresse des Absenders, zB "beispiel@msn.com"
NodeList idElementList = element.getElementsByTagName("ID");
Element idElement = (Element)
idElementList.item(0);
NodeList id = idElement.getChildNodes();
// Die Nachricht selbst
NodeList messageElementList = element.getElementsByTagName("MESSAGE");
if(messageElementList.getLength() != 0) // Falls MESSAGE-Tag existiert, ansonsten leeren String speichern
{
Element messageElement = (Element)
messageElementList.item(0);
NodeList message = messageElement.getChildNodes();
messageA[i] = message.item(0).getNodeValue();
}
else
{
messageA[i] = "";
}
fromA[i] = from.item(0).getNodeValue();
timeA[i] = time.item(0).getNodeValue();
dateA[i] = date.item(0).getNodeValue();
idA[i] = id.item(0).getNodeValue();
}
}
// Speichert die eigene ID sowie die des Chatpartners
boolean fremdIDGespeichert = false;
boolean eigeneIDGespeichert = false;
int i = 0;
while(fremdIDGespeichert == false)
{
if(fremdIDGespeichert == false && Messages.getContact().equals(fromA[i]))
{
Messages.setfremdID(idA[i]);
fremdIDGespeichert = true;
}
i++;
}
i = 0;
while(eigeneIDGespeichert == false)
{
if(eigeneIDGespeichert == false && !Messages.getContact().equals(fromA[i]))
{
Messages.seteigeneID(idA[i]);
eigeneIDGespeichert = true;
}
i++;
}
// Die fertigen Arrays dem Rückgabe Objekt zuweisen
Messages.setFrom(fromA);
Messages.setTime(timeA);
Messages.setDate(dateA);
Messages.setId(idA);
Messages.setMessage(messageA);
}
catch (Exception e)
{
System.out.println(e.toString());
}
return Messages;
}
}
[edit]
Die Struktur der XML, falls benötigt:
Code:
<IMHISTORY>
<EVENT>
<CONTACT></CONTACT>
<FROM></FROM>
<TIME></TIME>
<DATE></DATE>
<PROTOCOL></PROTOCOL>
<ID></ID>
<TYPE></TYPE>
<MESSAGE></MESSAGE>
</EVENT>
[...]
</IMHISTORY>
[/edit]
Ich wäre für jede Hilfe dankbar.. und ja, die Methode ist glaube ich suboptimal geschrieben, allerdings ist es das erste Mal das ich etwas mit XML mache und ich bin schon froh das es überhaupt läuft
Zuletzt bearbeitet: