Come formattare e leggere le istruzioni di elaborazione XML utilizzando Java StAX?
Domanda
Innanzitutto, come formattare l'istruzione di elaborazione XML, è:
<?processingInstructionName attribute="value" attribute2="value2"?>
Utilizzando StAX, voglio quindi leggerlo gestendo il XMLStreamConstants.PROCESSING_INSTRUCTION
( javadoc ), ma fornisce solo due metodi per recuperare informazioni sull'istruzione di elaborazione dal XMLStreamReader
:
getPITarget()
getPIData()
javadoc per questi due metodi non è molto utile.
- La formattazione XML è corretta?
- È questo il modo corretto di procedere
analisi delle istruzioni di elaborazione
utilizzando il
XMLStreamReader
StAX API? - Come posso usare
getPITarget ()
egetPIData ()
per restituire più argomenti?
Soluzione
1. La formattazione XML è corretta?
Sì , tuttavia si noti che a istruzioni di elaborazione non ha attributi - solo dati. Ciò che sembra attributi fanno parte dei dati e alcune persone li chiamano " pseudo-attributi
" ;.
2.È questo il modo corretto di analizzare le istruzioni di elaborazione usando le API StAX XMLStreamReader?
Sì.
3.Come utilizzo getPITarget () e getPIData () per restituire più argomenti?
Se con " argomenti multipli " intendi forse più di uno pseudo-attributi contenuti nei dati, la risposta è che il tuo codice deve analizzare i dati (usando alcuni metodi stringa standard come C # split ()
e recupera il set di coppie nome-valore per tutti gli pseudo -attributes.
Altri suggerimenti
Penso che questa nozione di istruzioni di elaborazione con attributi provenga da alcuni vecchi manuali xml. Ad un certo punto si è discusso di raccomandare ai PI di onorare o richiedere tale strutturazione. Tuttavia, la specifica XML ufficiale non ha mai richiesto o addirittura raccomandato tale utilizzo.
Quindi, fondamentalmente, devi analizzare tu stesso i contenuti - possono essere in qualsiasi formato, ma se sai che usa la notazione degli attributi puoi analizzarli.
Per quanto ne so, nessuno dei parser xml Java o pacchetti di elaborazione supporta tale utilizzo, sfortunatamente.
Sebbene la risposta di Dimitre sia tecnicamente corretta, alcune librerie popolari ora analizzano gli pseudo-attributi delle istruzioni di elaborazione come ci si aspetterebbe. Gli esempi seguenti analizzano le seguenti istruzioni di elaborazione XML per ottenere il valore dell'attributo pseduo href
:
<?xml-stylesheet type="text/xsl" href="markdown.xsl"?>
JDOM2
Utilizzo di JDOM2 :
import org.jdom2.ProcessingInstruction;
import org.xml.sax.helpers.DefaultHandler;
public class ProcessingInstructionHandler extends DefaultHandler {
@Override
public void processingInstruction( final String target, final String data ) {
final ProcessingInstruction pi = new ProcessingInstruction( target, data );
System.out.println( pi.getPseudoAttributeValue( "href" ) );
}
}
Saxon
Uso di Saxon :
import static net.sf.saxon.tree.util.ProcInstParser.getPseudoAttribute;
import org.xml.sax.helpers.DefaultHandler;
public class ProcessingInstructionHandler extends DefaultHandler {
@Override
public void processingInstruction( final String target, final String data ) {
System.out.println( getPseudoAttribute( data, "href" ) );
}
}