5

컴파일 된 Android XML 리소스에 액세스해야 할 때 컴파일 된 이진 파일을 제공하기 때문에 openRawResource(resId)을 사용할 수없는 것 같습니다.Android XmlResourceParser를 편리하게 사용 하시겠습니까?

XML을 얻는 유일한 방법은 XmlResourceParser (XmlPullParser 구현)을 반환하는 getXml(resId)을 사용하는 것입니다.

Android 리소스에서 복잡한 컴파일 된 XML을 (비싸지는 않지만) 간편하게 비 직렬화 할 수 있습니까?

은 내가 Simple XML 프레임 워크 해킹 시도 : (. 위의 스칼라 코드를 단순화)

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) 
  • 가 어떤인가 getPrefix을 호출하지 않는 XML 디시리얼라이저?
  • XmlPullParser에서 Node 트리를 만드는 기존 스칼라 라이브러리가 있습니까? (따라서 Scala 투영 함수를 사용하여 쿼리 할 수 ​​있습니다.)
  • 작지만 복잡한 컴파일 된 XML을 리소스에서 읽는 방법에 대한 다른 힌트가 있습니까?
+0

어디 - 당신이 입술에 저장 시도/원료? 그래서 직접 액세스 할 XML 문서를 저장하는 방법입니다. 스키마/스타일 시트 저장시 주름은 확장이 'xml'이어야한다는 것입니다. 파일 이름에 실제 확장명을 추가하는 것입니다 .... 그래서 indent.xsl은 xsl_indent.xml이됩니다. –

답변

0

사용중인 XmlPull 버전이 네임 스페이스를 지원하지 않는 것으로 보입니다.

org.simpleframework.xml.stream.DocumentProvider

이 W3C DOM을 사용을 사용하십시오.

+0

'DocumentProvider'는 지원하지 않습니다. 'XmlPullReader'를 소스로 사용하십시오. 아니면'XmlResourceParser'와 함께 어떻게 사용하고 있습니까? –

0

래퍼 클래스를 만들고 마침내 문제를 해결했습니다. (내가 대신 스칼라의 자바를 사용하고 있습니다.)

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

대신 고해상도/XML에서 XML 파일을 저장

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