5

Quando ho bisogno di accedere a risorse XML Android compilate, sembra che non sia possibile utilizzare openRawResource(resId) poiché mi fornisce un binario compilato.Uso pratico di Android XmlResourceParser?

L'unico modo che ho trovato per ottenere l'XML è quello di utilizzare getXml(resId) che restituisce XmlResourceParser (che implementa XmlPullParser).

Come posso deserializzare comodamente complessi XML compilati (ma non grandi) da risorse Android?

ho cercato di incidere il quadro Simple XML: (. Il codice Scala sopra è semplificata)

val serializer = new Persister() 
serializer.read(classOf[AFoo], 
    new NodeReader(new PullReader(r.getXml(resId))).readRoot) 

Tuttavia non riesce:

java.lang.RuntimeException: getPrefix not supported 
    at android.content.res.XmlBlock$Parser.getPrefix(XmlBlock.java:156) 
    at org.simpleframework.xml.stream.PullReader$Start.<init>(PullReader.java:373) 
    at org.simpleframework.xml.stream.PullReader.start(PullReader.java:143) 
    at org.simpleframework.xml.stream.PullReader.read(PullReader.java:109) 
    at org.simpleframework.xml.stream.PullReader.read(PullReader.java:117) 
    at org.simpleframework.xml.stream.PullReader.next(PullReader.java:89) 
    at org.simpleframework.xml.stream.NodeReader.readElement(NodeReader.java:111) 
    at org.simpleframework.xml.stream.NodeReader.readRoot(NodeReader.java:85) 
  • C'è qualche Deserializzatore XML che non chiama getPrefix?
  • Oppure esiste già una libreria Scala che costruisce un albero Node dallo XmlPullParser? (Quindi sarà possibile interrogarlo usando la funzione di proiezione di Scala.)
  • Oppure avete qualche altro suggerimento su come leggere piccoli ma complessi XML compilati da risorse?
+0

Invece di memorizzare i file XML in res/xml - hai provato a loro memorizzazione in res/raw? È così che immagazzino i documenti xml a cui voglio avere accesso diretto. La ruga del salvataggio degli schemi/fogli di stile è che l'estensione deve essere 'xml' - quello che faccio è anteporre l'estensione effettiva al nome del file .... quindi indent.xsl diventa xsl_indent.xml –

risposta

0

Sembra che la versione di XmlPull in uso non supporti gli spazi dei nomi. Provare a utilizzare il

org.simpleframework.xml.stream.DocumentProvider

Questo utilizza DOM del W3C.

+0

'DocumentProvider' non supporta il 'XmlPullReader' come fonte. O come lo stai usando con 'XmlResourceParser'? –

0

Ho fatto una lezione di wrapper e alla fine ho risolto il problema. (Sto usando Java al posto di Scala.)

Persister serializer = new Persister(); 
serializer.read(AFoo.class, 
    new NodeReader(new PullReader(new XmlPullParserWrapper(r.getXml(resId)))).readRoot()) 

dove

public class XmlPullParserWrapper implements XmlPullParser { 
    private XmlPullParser mParser; 

    public XmlPullParserWrapper(XmlPullParser parser) { 
     mParser = parser; 
    } 

    @Override 
    public void setFeature(String name, boolean state) throws XmlPullParserException { 
     mParser.setFeature(name, state); 
    } 

    @Override 
    public boolean getFeature(String name) { 
     return mParser.getFeature(name); 
    } 

    @Override 
    public void setProperty(String name, Object value) throws XmlPullParserException { 
     mParser.setProperty(name, value); 
    } 

    @Override 
    public Object getProperty(String name) { 
     return mParser.getProperty(name); 
    } 

    @Override 
    public void setInput(Reader in) throws XmlPullParserException { 
     mParser.setInput(in); 
    } 

    @Override 
    public void setInput(InputStream inputStream, String inputEncoding) throws XmlPullParserException { 
     mParser.setInput(inputStream, inputEncoding); 
    } 

    @Override 
    public String getInputEncoding() { 
     return mParser.getInputEncoding(); 
    } 

    @Override 
    public void defineEntityReplacementText(String entityName, String replacementText) throws XmlPullParserException { 
     mParser.defineEntityReplacementText(entityName, replacementText); 
    } 

    @Override 
    public int getNamespaceCount(int depth) throws XmlPullParserException { 
     return mParser.getNamespaceCount(depth); 
    } 

    @Override 
    public String getNamespacePrefix(int pos) throws XmlPullParserException { 
     return mParser.getNamespacePrefix(pos); 
    } 

    @Override 
    public String getNamespaceUri(int pos) throws XmlPullParserException { 
     return mParser.getNamespaceUri(pos); 
    } 

    @Override 
    public String getNamespace(String prefix) { 
     return mParser.getNamespace(prefix); 
    } 

    @Override 
    public int getDepth() { 
     return mParser.getDepth(); 
    } 

    @Override 
    public String getPositionDescription() { 
     return mParser.getPositionDescription(); 
    } 

    @Override 
    public int getLineNumber() { 
     return mParser.getLineNumber(); 
    } 

    @Override 
    public int getColumnNumber() { 
     return mParser.getColumnNumber(); 
    } 

    @Override 
    public boolean isWhitespace() throws XmlPullParserException { 
     return mParser.isWhitespace(); 
    } 

    @Override 
    public String getText() { 
     return mParser.getText(); 
    } 

    @Override 
    public char[] getTextCharacters(int[] holderForStartAndLength) { 
     return mParser.getTextCharacters(holderForStartAndLength); 
    } 

    @Override 
    public String getNamespace() { 
     return mParser.getNamespace(); 
    } 

    @Override 
    public String getName() { 
     return mParser.getName(); 
    } 

    @Override 
    public String getPrefix() { 
     return ""; 
    } 

    @Override 
    public boolean isEmptyElementTag() throws XmlPullParserException { 
     return mParser.isEmptyElementTag(); 
    } 

    @Override 
    public int getAttributeCount() { 
     return mParser.getAttributeCount(); 
    } 

    @Override 
    public String getAttributeNamespace(int index) { 
     return mParser.getAttributeNamespace(index); 
    } 

    @Override 
    public String getAttributeName(int index) { 
     return mParser.getAttributeName(index); 
    } 

    @Override 
    public String getAttributePrefix(int index) { 
     return ""; 
    } 

    @Override 
    public String getAttributeType(int index) { 
     return mParser.getAttributeType(index); 
    } 

    @Override 
    public boolean isAttributeDefault(int index) { 
     return mParser.isAttributeDefault(index); 
    } 

    @Override 
    public String getAttributeValue(int index) { 
     return mParser.getAttributeValue(index); 
    } 

    @Override 
    public String getAttributeValue(String namespace, String name) { 
     return mParser.getAttributeValue(namespace, name); 
    } 

    @Override 
    public int getEventType() throws XmlPullParserException { 
     return mParser.getEventType(); 
    } 

    @Override 
    public int next() throws XmlPullParserException, IOException { 
     return mParser.next(); 
    } 

    @Override 
    public int nextToken() throws XmlPullParserException, IOException { 
     return mParser.nextToken(); 
    } 

    @Override 
    public void require(int type, String namespace, String name) throws XmlPullParserException, IOException { 
     mParser.require(type, namespace, name); 
    } 

    @Override 
    public String nextText() throws XmlPullParserException, IOException { 
     return mParser.nextText(); 
    } 

    @Override 
    public int nextTag() throws XmlPullParserException, IOException { 
     return mParser.nextTag(); 
    } 
}