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 &amp; 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.

È stato utile?

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();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top