5

जब मुझे एक संकलित एंड्रॉइड एक्सएमएल संसाधनों तक पहुंचने की आवश्यकता होती है, तो ऐसा लगता है कि मैं openRawResource(resId) का उपयोग नहीं कर सकता क्योंकि यह मुझे एक संकलित बाइनरी देता है।एंड्रॉइड XmlResourceParser का सुविधाजनक उपयोग?

एक्सएमएल प्राप्त करने का एकमात्र तरीका getXml(resId) का उपयोग करना है जो XmlResourceParser (जो XmlPullParser लागू करता है) का उपयोग करता है।

मैं एंड्रॉइड संसाधनों से जटिल संकलित एक्सएमएल (लेकिन बड़ा नहीं) कैसे आसानी से deserialize कर सकते हैं?

मैं Simple एक्सएमएल ढांचे को हैक करने की कोशिश की है: (। ऊपर स्काला कोड सरल है)

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

हालांकि यह विफल रहता है:

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) 
  • वहाँ किसी भी है XML deserializer जो getPrefix पर कॉल नहीं करता है?
  • या क्या पहले से ही स्कैला लाइब्रेरी मौजूद है जो XmlPullParser से Node पेड़ बनाती है? (इसलिए स्कैला प्रोजेक्शन फ़ंक्शन का उपयोग करके इसे क्वेरी करना संभव होगा।)
  • या क्या आपके पास कोई अन्य संकेत है कि संसाधनों से छोटे लेकिन जटिल संकलित XML को कैसे पढ़ा जाए?
+0

- आप उन्हें रेस में भंडारण की कोशिश की है/कच्चे? इस प्रकार मैं एक्सएमएल दस्तावेजों को स्टोर करता हूं जिन्हें मैं सीधे एक्सेस करना चाहता हूं। स्कीमा/स्टाइलशीट को सहेजने के लिए शिकन यह है कि एक्सटेंशन को 'xml' होना आवश्यक है - जो मैं करता हूं वह फ़ाइल नाम में वास्तविक एक्सटेंशन प्रीपेड करता है .... इसलिए indent.xsl xsl_indent.xml –

उत्तर

0

ऐसा लगता है कि आप जिस एक्सएमएलपूल का उपयोग कर रहे हैं उसका संस्करण नामस्थानों का समर्थन नहीं करता है।

org.simpleframework.xml.stream.DocumentProvider

यह W3C डोम का उपयोग करता है का उपयोग का प्रयास करें।

+0

'दस्तावेज़ प्रदाता' समर्थन नहीं करता है स्रोत के रूप में 'XmlPullReader'। या आप इसे 'XmlResourceParser' के साथ कैसे उपयोग कर रहे हैं? –

0

मैंने एक रैपर वर्ग बनाया और अंततः इस मुद्दे के आसपास हो गया। (मैं जावा का उपयोग कर रहा स्काला के बजाय।)

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

जहां

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(); 
    } 
} 
बजाय में रेस/xml एक्सएमएल फ़ाइलों को संग्रहीत करने के
संबंधित मुद्दे