Uso conveniente de Android XmlResourceParser?

Cuando necesito acceder a un compilado de recursos de Android XML, parece que no puedo usar openRawResource(resId) ya que me da un binario compilado.

La única manera que he encontrado para obtener el XML es usar getXml(resId) que devuelve XmlResourceParser (que implementa XmlPullParser ).

¿Cómo puedo deserializar convenientemente complejos compilados XML (pero no grandes) de los recursos de Android?

He intentado hackear el marco XML Simple :

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

(El código de Scala arriba es simplificado.)

Sin embargo, falla:

 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) 
  • ¿Existe algún deserializador XML que no llame a getPrefix ?
  • ¿O existe ya una biblioteca de Scala que construye un árbol de Node desde el XmlPullParser ? (Por lo tanto, será posible consultarlo usando la función de proyección de Scala.)
  • ¿O tiene alguna otra pista sobre cómo leer los XML compilados pequeños pero complejos de los recursos?

Parece que la versión de XmlPull que está utilizando no admite espacios de nombres. Intenta usar el

Org.simpleframework.xml.stream.DocumentProvider

Esto utiliza DOM de w3c.

Hice una clase de envoltura y finalmente me puse alrededor del tema. (Estoy usando Java en lugar de Scala.)

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

dónde

 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(); } } 
  • @Namespace en Android SimpleXml
  • Constructor no coincidente para la clase {proguard]
  • XML con la biblioteca SimpleXML - Rendimiento en Android
  • Simple Xml - orden de elementos no conservados?
  • Cómo generar simple-xml java objeto anotado desde el esquema xsd
  • Cómo analizar el XML de SimpleXML
  • Android - XML ​​serialization - simpleframework - Ruta con Elementos opcionales (required = false) - ¿Cómo ocultar valores nulos?
  • Android, org.simpleframework.xml Existencia de persistencia, Elemento 'foo' ya se utiliza
  • No se puede crear un conversor para mi clase en Android Retrofit2 converter-simplexml library
  • Problema de velocidad de Android con la deserialización mediante SimpleXML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.