2 Stimmen

Wie würden Sie Java verwenden, um verschiedene XML-Dokumente zu verarbeiten?

Ich bin auf der Suche nach der besten Methode zum Parsen verschiedener XML-Dokumente mit einer Java-Anwendung. Ich tue dies derzeit mit SAX und einem benutzerdefinierten Content-Handler und es funktioniert großartig - zippy und stabil.

Ich habe beschlossen, die Option zu erkunden, die das gleiche Programm, das derzeit ein einzelnes Format XML-Dokument empfängt, zwei zusätzliche XML-Dokumentformate mit verschiedenen XML-Elementänderungen empfangen. Ich hatte gehofft, einfach den ContentHandler mit einem geeigneten auf der Grundlage der ersten "startElement" im Dokument austauschen... aber, uh-duh, der ContentHandler ist festgelegt und dann das Dokument wird geparst!

... constructor ...
{
SAXParserFactory spf = SAXParserFactory.newInstance();

try {
SAXParser sp = spf.newSAXParser();
parser = sp.getXMLReader();
parser.setErrorHandler(new MyErrorHandler());
} catch (Exception e) {} 

... parse StringBuffer ...
try {
parser.setContentHandler(pP);
parser.parse(new InputSource(new StringReader(xml.toString())));
return true;
} catch (IOException e) {
    e.printStackTrace();
} catch (SAXException e) {
    e.printStackTrace();
}
...

Es sieht also nicht so aus, als ob ich das so machen könnte, wie ich es ursprünglich dachte.

Sehe ich die Sache also völlig falsch? Was ist die beste Methode, um mehrere einzelne XML-Dokumente mit demselben XML-Verarbeitungscode zu parsen? Ich habe vorhin versucht, in einem allgemeineren Beitrag zu fragen, aber ich glaube, ich war zu vage. . Aus Geschwindigkeits- und Effizienzgründen habe ich DOM nie wirklich in Betracht gezogen, da diese XML-Dokumente ziemlich groß sind und das System alle paar Minuten etwa 1200 erhält. Es ist nur ein einseitiger Versand von Informationen

Um diese Frage zu lang und fügen Sie zu meiner Verwirrung; folgende ist ein Mockup von einigen verschiedenen XML-Dokumenten, die ich möchte eine einzelne SAX, StAX, oder ??

products.xml:

<products>
<product>
  <id>1</id>
  <name>Foo</name>
<product>
  <id>2</id>
  <name>bar</name>
</product>
</products>

stores.xml:

<stores>
<store>
  <id>1</id>
  <name>S1A</name>
  <location>CA</location>
</store>
<store>
  <id>2</id>
  <name>A1S</name>
  <location>NY</location>
</store>
</stores>

manager.xml:

<managers>
<manager>
  <id>1</id>
  <name>Fen</name>
  <store>1</store>
</manager>
<manager>
  <id>2</id>
  <name>Diz</name>
  <store>2</store>
</manager>
</managers>

0voto

Wenn Sie eine dynamischere Handhabung wünschen, würde der Stax-Ansatz wahrscheinlich besser funktionieren als Sax. Das ist aber immer noch recht anspruchslos; wenn Sie einen einfacheren Ansatz wünschen, sind XStream und JAXB meine Favoriten. Aber sie erfordern ziemlich starre Objekte, auf die sie abgebildet werden müssen.

0voto

ghbuch Punkte 114

Ich stimme mit StaxMan überein, der interessanterweise möchte, dass Sie Stax verwenden. Es ist ein Pull-basierter Parser anstelle des Push, den Sie derzeit verwenden. Dies würde einige erhebliche Änderungen an Ihrem Code aber erfordern.

0voto

StaxMan Punkte 107669

:-)

Ja, ich habe eine gewisse Vorliebe für Stax. Aber wie ich schon sagte, ist die Datenbindung oft bequemer als eine Streaming-Lösung. Aber wenn es Streaming Sie wollen, und brauchen nicht Pipelining (von mehreren Filterstufen), Stax ist einfacher als SAX.

Und noch etwas: So gut XOM auch ist (im Vergleich zu Alternativen), ist Tree Model oft nicht das Richtige, wenn man nicht mit "dokumentenzentriertem" Xml arbeitet (~= xhtml-Seiten, docbook, open office docs). Für Datenaustausch, Konfigurationsdateien usw. ist Datenbindung bequemer, effizienter und natürlicher. Sagen Sie einfach nein zu Baummodellen wie DOM für diese Anwendungsfälle. JAXB, XStream, JibX sind also gut. Oder, für den anspruchsvolleren Geschmack, Digester, Castor, Xmlbeans.

0voto

vtd-xml-author Punkte 3234

VTD-XML ist dafür bekannt, die beste XML-Verarbeitungstechnologie für anspruchsvolle XML-Verarbeitung zu sein. Siehe die Referenz unten für einen Beweis

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X