5

Khi tôi cần truy cập tài nguyên XML được biên soạn của Android, có vẻ như tôi không thể sử dụng openRawResource(resId) vì nó cung cấp cho tôi một tệp nhị phân được biên dịch.Sử dụng thuận tiện Android XmlResourceParser?

Cách duy nhất tôi tìm thấy để nhận XML là sử dụng getXml(resId) trả về XmlResourceParser (triển khai XmlPullParser).

Làm thế nào tôi có thể thuận tiện deserialize XML phức tạp biên dịch (nhưng không lớn) từ tài nguyên Android?

Tôi đã cố gắng để hack khuôn khổ Simple XML: (. Mã Scala ở trên được đơn giản hóa)

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

Tuy nhiên nó không thành công:

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ó Trình gỡ rối XML không gọi getPrefix?
  • Hoặc đã có thư viện Scala hiện có xây dựng một cây Node từ XmlPullParser? (Vì vậy, nó sẽ có thể truy vấn nó bằng cách sử dụng chức năng chiếu Scala.)
  • Hoặc bạn có gợi ý nào khác về cách đọc XML được biên dịch nhỏ nhưng phức tạp từ tài nguyên không?
+0

Thay vì lưu trữ các file xml trong res/xml - Bạn đã cố gắng lưu trữ chúng trong res/raw? Đó là cách tôi lưu trữ các tài liệu xml mà tôi muốn có quyền truy cập trực tiếp vào. Nếp nhăn để lưu lược đồ/biểu định kiểu là phần mở rộng cần phải là 'xml' - những gì tôi làm là thêm phần mở rộng thực vào tên tệp .... do đó indent.xsl trở thành xsl_indent.xml –

Trả lời

0

Dường như phiên bản XmlPull bạn đang sử dụng không hỗ trợ không gian tên. Hãy thử sử dụng

org.simpleframework.xml.stream.DocumentProvider

Điều này sử dụng w3c DOM.

+0

'DocumentProvider' không hỗ trợ 'XmlPullReader' làm nguồn. Hoặc bạn đang sử dụng nó như thế nào với 'XmlResourceParser'? –

0

Tôi đã tạo lớp bao bọc và cuối cùng đã khắc phục được sự cố. (Tôi đang sử dụng Java thay vì Scala.)

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

nơi

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(); 
    } 
} 
Các vấn đề liên quan