Jeśli przyjąć rozwiązanie bok JAXB/wiosna wsadowego, może warto spojrzeć na SAX Parser.
Jest to bardziej zorientowany na zdarzenia sposób analizowania plików XML i może być dobrym rozwiązaniem, jeśli chcesz bezpośrednio zapisywać do pliku docelowego podczas analizowania. Analizator składni SAX nie odczytuje całej zawartości xml w pamięci, ale uruchamia metody, gdy zawiera elementy w strumieniu wejściowym. O ile mi się to udało, jest to bardzo wydajny sposób przetwarzania pamięci.
W porównaniu do twojego Stax-Solution SAX "przesyła" dane do twojej aplikacji - oznacza to, że musisz utrzymywać stan (jak na przykład, w którym tagu jesteś skandalizowany), więc musisz śledzić bieżące Lokalizacja.Nie jestem pewien, czy to jest coś, co naprawdę wymaga
Poniższy przykład odczytuje w pliku XML w swojej strukturze i wypisuje cały tekst w GroupBMsg-tags:
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 {}
}
istnieje specyficzny język” zamierzacie użyć? –
Czy struktura pliku musi być sprawdzona, czy może zakładać, że jest poprawna na sé? – Thilo
Używam Java, JAXB/Spring Batch jest preferowaną opcją, czytałem wiele postów, ale wciąż nie mam pojęcia, jak skutecznie przetwarzać powyższy xml. – Weber