Domanda
Sono l'analisi di un (non ben formato) file di Apple Plist con Java.
Il mio codice è simile al seguente:
InputStream in = new FileInputStream( "foo" );
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader parser = factory.createXMLEventReader( in );
while (parser.hasNext()){
XMLEvent event = parser.nextEvent();
//code to navigate the nodes
}
Le parti I "m analisi stanno cercando in questo modo:
<dict>
<key>foo</key><integer>123</integer>
<key>bar</key><string>Boom & Shroom</string>
</dict>
Il mio problema è ora, che i nodi che contiene una commerciale non sono analizzati come dovrebbero, perché la e commerciale è che rappresenta un'entità.
Che cosa posso fare per ottenere il valore del nodo come stringa completa, invece di parti rotte?
Grazie in anticipo.
Soluzione
Si dovrebbe essere in grado di risolvere il problema impostando la proprietà IS_COALESCING
sul XMLInputFactory
(Anch'io preferisco XMLStreamReader
sopra XMLEventReader
, ma YMMV):
XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
InputStream in = // ...
xmlReader = factory.createXMLStreamReader(in, "UTF-8");
Per inciso, al meglio della mia conoscenza nessuno dei parser JDK gestirà "non ben formato" XML senza soffocare. Il tuo XML è, infatti, ben formato:. Utilizza un soggetto piuttosto che un commerciale grezzo
Altri suggerimenti
C'è un metodo getElementText()
predefinito, che è bacato in jdk1.6.0_15, ma funziona bene con jdk1.6.0_19. Un programma completo per analizzare facilmente il file plist è questa:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;
public class Parser {
public static void main(String[] args) throws XMLStreamException, IOException {
InputStream in = new FileInputStream("foo.xml");
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader parser = factory.createXMLEventReader(in);
assert parser.nextEvent().isStartDocument();
XMLEvent event = parser.nextTag();
assert event.isStartElement();
final String name1 = event.asStartElement().getName().getLocalPart();
if (name1.equals("dict")) {
while ((event = parser.nextTag()).isStartElement()) {
final String name2 = event.asStartElement().getName().getLocalPart();
if (name2.equals("key")) {
String key = parser.getElementText();
System.out.println("key: " + key);
} else if (name2.equals("integer")) {
String number = parser.getElementText();
System.out.println("integer: " + number);
} else if (name2.equals("string")) {
String str = parser.getElementText();
System.out.println("string: " + str);
}
}
}
assert parser.nextEvent().isEndDocument();
}
}