2016-01-05 26 views
7

Essendo nuovo nell'analisi XML sto cercando di capire le diverse tecnologie. C'è una quantità di confusione di diverse tecnologie per le diverse esigenze:Qual è il vantaggio dell'uso di JAXP invece di DOM/SAX direttamente in Java?

  • W3C-DOM
  • XOM
  • JDOM
  • JAXP
  • JAXB
  • DOM
  • SAX
  • StAX
  • TrAX
  • Woodstox
  • dom4j
  • Crimson
  • VTD-XML
  • Xerces-J
  • Castor
  • xstream
  • ...

Solo per citarne alcuni.

DOM e SAX sembrano essere un modo di basso livello per l'analisi e lavorare su XML, così ho deciso di concentrarsi su quelli che vengono menzionati più in fonti diverse e sono di basso livello:

DOM, SAX, JAXP.

Ho letto di parser in generale qui su , JAXP-Tutorial from Oracle, XML-Parsing in general e così via.

Ho anche provato alcuni tutorial come this german one e altri.

Mi sto occupando un pò di DOM e SAX ora, ma il motivo per usare JAXP è ancora oltre me. Sembra essere più un'interfaccia per usare DOM, SAX, ... internamente, ma perché non usare direttamente DOM o SAX?

Qual è il vantaggio dell'utilizzo di JAXP in termini non comuni?

+0

Quando sto lavorando con (manipolando/creando) xml sto sempre usando DOM, ma questa è solo la mia opinione personale! Penso che funzioni abbastanza bene e fornisca tutte le funzionalità di cui hai bisogno. – ParkerHalo

+0

Questo potrebbe essere di aiuto https://jaxp.java.net/1.4/JAXP-FAQ.html –

+0

ParkerHalo: DOM sembra essere un modo molto intuitivo per lavorare con XML. La ragione principale per non usare DOM è spesso definita come la dimensione di un documento, ma la gente dice solo "se il documento è troppo grande, usa SAX invece di DOM", mentre non definisce mai cosa significhi "grande": linee di codice, documento dimensione in MB, numero di oggetti xml, ... e a quale numero questo si verifica. Sono 20.000 linee considerate grandi, o 1.000.000 e così via. – hamena314

risposta

6

(Anche se non l'hai detto in modo esplicito, la tua domanda sembra riferirsi esclusivamente al mondo Java, e questa risposta che riflette.)

JAXP è un insieme di interfacce che coprono parsing XML, trasformazione XSLT, e Convalida dello schema XML. Se ci concentriamo solo sul lato di analisi XML, il suo principale contributo è fornire un meccanismo per localizzare un'implementazione del parser XML, in modo che il codice sorgente non sia bloccato in un particolare prodotto. Francamente questo è di valore limitato in questi giorni; gli unici due parser SAX/DOM di uso comune sono quelli incorporati nel JDK e Apache Xerces. Apache Xerces è migliore sotto ogni aspetto, tranne per il fatto che è necessario scaricarlo separatamente.

Come per le altre interfacce di analisi, si suddividono in due categorie: API basate su eventi e API basate su albero. Le API basate su albero sono molto più facili da utilizzare, ma possono utilizzare molta memoria quando si gestiscono documenti di grandi dimensioni.

Le due API basate su eventi dominanti sono SAX (push) e StAX (pull).L'analisi pull è qualcosa che molti programmatori trovano più facile perché è possibile utilizzare lo stack del programma per mantenere le informazioni sullo stato; sfortunatamente, sebbene l'API di StAX sia un po 'buggy, diverse implementazioni hanno risolto le sue lacune in modi diversi. L'implementazione più completa e affidabile di StAX è il parser di Woodstox; l'implementazione più completa e affidabile di SAX è Apache Xerces. Ma non tentare di utilizzare un approccio di analisi basato sugli eventi a meno che l'applicazione non abbia realmente bisogno di quel livello di prestazioni (ea meno che non si disponga del livello di esperienza necessario per evitare di perdere tutti i guadagni in termini di prestazioni a livello di applicazione).

Per API basate su albero, il DOM rimane dominante solo perché è stato definito da W3C ed è implementato nel JDK, ed è quindi percepito come "standard"; è anche quello menzionato in tutti i libri sull'argomento. Tuttavia, tra tutti i modelli ad albero, è indiscutibilmente il peggiore progettato (principalmente perché precede l'introduzione di spazi dei nomi). Le alternative includono JDOM2, DOM4J, XOM e AXIOM. Tendo a raccomandare JDOM2 o XOM.

+0

Hai ragione, ho cambiato il mio titolo per avere "Java" al suo interno. Quindi JAXP è una sorta di scatola che contiene DOM/SAX (XML Parsing), XSLT, ...? E se uso direttamente DOM/SAX, sto indirettamente "usando" JAXP, dato che DOM e SAX provengono da JAXP? Ho letto alcune recensioni su XOM e sembra essere abbastanza buono, ma la licenza (LGPL) potrebbe renderla difficile da usare nei miei progetti. Ma devo leggere di più a riguardo. – hamena314

+0

Si noti che l'implementazione SAX/DOM nel JDK è basata su Apache Xerces e in realtà è meglio conservata dell'originale. –

+0

@AndreasVeithen, Sì, è una biforcazione dell'originale. Ma ha alcuni bug molto seri che sono stati conosciuti per gli anni d'asino (beh, almeno dal 2009) e non sono mai stati risolti. Non si ottiene alcun tipo di riconoscimento quando si segnalano loro, solo andare in un buco nero. –

1

JAXP è solo il nome di Sun (ora Oracle) per una raccolta di classi SAX e DOM che vengono associati al JDK. Se stai usando JAXP, stai anche usando SAX e/o DOM. Non è una cosa diversa.

JAXP aggiunge anche alcune classi di helper nel pacchetto javax.xml.parsers che colmano le lacune in SAX 1 e DOM 1, cioè vecchie versioni di queste librerie da oltre 15 anni. Tuttavia questi non sono necessari con SAX2/DOM3 che vengono utilizzati oggi. Ancora peggio, le classi javax.xml.parsers come DocumentBuilderFactory e SAXParserFactory sono progettate in modo confuso (non sono, per impostazione predefinita, prive di spazio dei nomi), quindi vengono quasi sempre utilizzate in modo errato. Quindi gli sviluppatori vengono qui per chiedere perché il loro programma non fa ciò che pensano che dovrebbe. Ignora semplicemente queste classi e usa XMLReaderFactory (SAX 2) o DOMImplementationLS (DOM 3).

+0

Namespace significa che in un documento XML una 'company' potrebbe avere un elemento XML chiamato' adress' e più avanti nel documento un 'employee' potrebbe avere un elemento XML chiamato anche' adress'? E 'questo, a cosa ti stai riferendo? E nonostante l'uso di classi Differency Factory (?) Come 'DOMImplementationLS' invece di' DocumentBuilderFactory', ci sono altre differenze nell'utilizzo? – hamena314

+0

@ElliotteRustyHarold Ho sempre pensato che JAXP sia un'interfaccia, ma quando si dice che Oracle/Sun usa il nome per riferirsi a "una raccolta di classi SAX e DOM" (cioè un'implementazione specifica), penso che tu sono giusti. Hanno una pessima esperienza nel confondere l'interfaccia con la loro implementazione specifica. –

+1

@ hamena314 Oltre alle classi di builder e factory, NON vi sono differenze nell'utilizzo tra JAXP SAX e SAX regolare. Sono le * stesse * classi. Sono solo in bundle con il JDK. La stessa risposta per DOM. Lo spazio dei nomi a conoscenza, in questo contesto, ha a che fare con il modo in cui il parser passa nomi locali e qualificati a quali metodi. L'attivazione è sempre attiva e le classi javax.xml.parsers disattivano l'impostazione per impostazione predefinita. :-( –