Android XmlResourceParser的方便使用?
当我需要访问已编译的Android XML资源时,似乎无法使用Android XmlResourceParser的方便使用?,android,scala,xml-parsing,android-resources,simple-framework,Android,Scala,Xml Parsing,Android Resources,Simple Framework,当我需要访问已编译的Android XML资源时,似乎无法使用openrawsource(resId),因为它给了我一个已编译的二进制文件 我发现获取XML的唯一方法是使用返回XmlResourceParser(实现XmlPullParser)的getXml(resId) 如何方便地从Android资源反序列化复杂编译的XML(但不是大的) 我试图破解XML框架: val serializer = new Persister() serializer.read(classOf[AFoo],
openrawsource(resId)
,因为它给了我一个已编译的二进制文件
我发现获取XML的唯一方法是使用返回XmlResourceParser
(实现XmlPullParser
)的getXml(resId)
如何方便地从Android资源反序列化复杂编译的XML(但不是大的)
我试图破解XML框架:
val serializer = new Persister()
serializer.read(classOf[AFoo],
new NodeReader(new PullReader(r.getXml(resId))).readRoot)
(上面的Scala代码已简化。)
但它失败了:
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)
java.lang.RuntimeException:不支持getPrefix
位于android.content.res.XmlBlock$Parser.getPrefix(XmlBlock.java:156)
位于org.simpleframework.xml.stream.PullReader$Start.(PullReader.java:373)
位于org.simpleframework.xml.stream.PullReader.start(PullReader.java:143)
位于org.simpleframework.xml.stream.PullReader.read(PullReader.java:109)
位于org.simpleframework.xml.stream.PullReader.read(PullReader.java:117)
位于org.simpleframework.xml.stream.PullReader.next(PullReader.java:89)
位于org.simpleframework.xml.stream.NodeReader.readElement(NodeReader.java:111)
位于org.simpleframework.xml.stream.NodeReader.readRoot(NodeReader.java:85)
- 是否有任何XML反序列化程序不调用
getPrefix
- 或者已经存在从
构建XmlPullParser
节点树的Scala库了吗?(因此可以使用Scala投影函数查询它。)
- 或者,您是否有其他关于如何从资源中读取小而复杂的编译XML的提示
这使用了W3CDOM。我创建了一个包装器类,最终解决了这个问题。(我使用的是Java而不是Scala。) 在哪里
DocumentProvider
不支持将XmlPullReader
作为源。或者您是如何将其与XmlResourceParser
一起使用的?而不是将xml文件存储在res/xml中--您是否尝试过将它们存储在res/raw中?这就是我存储希望直接访问的xml文档的方式。保存模式/样式表的难点在于扩展名必须是“xml”——我要做的是在文件名前面加上实际扩展名。。。。因此indent.xsl变成了xsl_indent.xml
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();
}
}