Wenn Sie eine Lösung zur Seite Batch JAXB/Frühjahr akzeptieren, Sie einen Blick auf die SAX-Parser haben möchten.
Dies ist eine eher ereignisorientierte Methode zum Parsen von XML-Dateien und kann ein guter Ansatz sein, wenn Sie während der Analyse direkt in die Zieldatei schreiben möchten. Der SAX-Parser liest nicht den gesamten XML-Inhalt in den Speicher, sondern löst Methoden aus, wenn Elemente im Eingabestream dekonzentriert werden. Soweit ich es erlebt habe, ist dies eine sehr speichereffiziente Art der Verarbeitung.
Im Vergleich zu Ihrer Stax-Lösung "schiebt" SAX die Daten in Ihre Anwendung - das heißt, Sie müssen den Zustand (wie in welchem Tag sind Sie aktuell) pflegen, damit Sie Ihren aktuellen Stand halten müssen Lage.Ich bin mir nicht sicher, ob das etwas, das Sie wirklich
Das folgende Beispiel liest in einer XML-Datei in Ihrer Struktur erfordern und druckt sich der Text innerhalb GroupBMsg-Schlagwörter:
import java.io.FileReader;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class SaxExample implements ContentHandler
{
private String currentValue;
public static void main(final String[] args) throws Exception
{
final XMLReader xmlReader = XMLReaderFactory.createXMLReader();
final FileReader reader = new FileReader("datasource.xml");
final InputSource inputSource = new InputSource(reader);
xmlReader.setContentHandler(new SaxExample());
xmlReader.parse(inputSource);
}
@Override
public void characters(final char[] ch, final int start, final int length) throws SAXException
{
currentValue = new String(ch, start, length);
}
@Override
public void startElement(final String uri, final String localName, final String qName, final Attributes atts) throws SAXException
{
// react on the beginning of tag "GroupBMsg" <GroupBMSg>
if (localName.equals("GroupBMsg"))
{
currentValue="";
}
}
@Override
public void endElement(final String uri, final String localName, final String qName) throws SAXException
{
// react on the ending of tag "GroupBMsg" </GroupBMSg>
if (localName.equals("GroupBMsg"))
{
// TODO: write into file
System.out.println(currentValue);
}
}
// the rest is boilerplate code for sax
@Override
public void endDocument() throws SAXException {}
@Override
public void endPrefixMapping(final String prefix) throws SAXException {}
@Override
public void ignorableWhitespace(final char[] ch, final int start, final int length)
throws SAXException {}
@Override
public void processingInstruction(final String target, final String data)
throws SAXException {}
@Override
public void setDocumentLocator(final Locator locator) { }
@Override
public void skippedEntity(final String name) throws SAXException {}
@Override
public void startDocument() throws SAXException {}
@Override
public void startPrefixMapping(final String prefix, final String uri)
throws SAXException {}
}
gibt es eine bestimmte Sprache, die Sie‘ wirst du benutzen? –
Muss die Struktur der Datei überprüft werden, oder können Sie davon ausgehen, dass sie per se gültig ist? – Thilo
Ich benutze Java, JAXB/Spring Batch ist die bevorzugte Option, ich habe viele Beiträge gelesen, aber immer noch keine Ahnung, wie man über Xml effektiv verarbeitet. – Weber