5

當我需要訪問編譯的Android XML資源時,似乎我不能使用openRawResource(resId),因爲它給了我一個編譯好的二進制文件。Android XmlResourceParser的便捷使用?

我發現獲取XML的唯一方法是使用返回XmlResourceParser(實現XmlPullParser)的getXml(resId)

如何方便地從Android資源反序列化複雜的編譯XML(但不是很大)?

我試圖破解Simple XML框架:(上面的Scala代碼被簡化)

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解串器,不叫getPrefix
  • 或者是已經存在Scala庫,從XmlPullParser建立Node樹? (因此可以使用Scala投影函數來查詢它。)
  • 或者您有任何其他提示如何從資源中讀取小而複雜的編譯XML?
+0

而不是存儲在res/xml的XML文件的 - 你試圖將它們存儲在res /生?這就是我如何存儲我想要直接訪問的xml文檔。 保存模式/樣式表的難點在於擴展名需要'xml' - 我所做的是預先對文件名進行實際擴展....所以indent.xsl變爲xsl_indent.xml – 2018-02-25 16:16:19

回答

0

似乎您使用的XmlPull版本不支持命名空間。嘗試使用

org.simpleframework.xml.stream.DocumentProvider

它使用W3C DOM。

+0

'DocumentProvider'不支持作爲源的'XmlPullReader'。或者你如何使用它'XmlResourceParser'? – 2013-04-12 11:06:36

0

我做了一個包裝類,並最終解決了這個問題。 (我使用Java而不是Scala的。)

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(); 
    } 
}