方便使用Android XmlResourceParser?
Posted
技术标签:
【中文标题】方便使用Android XmlResourceParser?【英文标题】:Convenient use of Android XmlResourceParser? 【发布时间】:2013-04-03 09:15:01 【问题描述】:当我需要访问已编译的 android XML 资源时,我似乎无法使用 openRawResource(resId)
,因为它为我提供了已编译的二进制文件。
我发现获取 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)
(上面的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)
有没有不调用getPrefix
的XML反序列化器?
或者是否已经存在从XmlPullParser
构建Node
树的Scala 库? (因此可以使用 Scala 投影函数对其进行查询。)
或者您有任何其他提示如何从资源中读取小而复杂的编译 XML?
【问题讨论】:
不是将 xml 文件存储在 res/xml 中——您是否尝试过将它们存储在 res/raw 中?这就是我存储想要直接访问的 xml 文档的方式。保存模式/样式表的问题在于扩展名必须是“xml”——我所做的是在文件名前面加上实际的扩展名......所以 indent.xsl 变成 xsl_indent.xml 【参考方案1】:我做了一个包装类,终于解决了这个问题。 (我使用的是 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();
【讨论】:
【参考方案2】:您使用的 XmlPull 版本似乎不支持命名空间。尝试使用
org.simpleframework.xml.stream.DocumentProvider
这使用 w3c DOM。
【讨论】:
DocumentProvider
不支持 XmlPullReader
作为源。或者你如何使用它与XmlResourceParser
?以上是关于方便使用Android XmlResourceParser?的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Z
有没有一种方便的方法可以使用 Kotlin 在 Android 中创建 Parcelable 数据类?
Android技术分享| 自定义View实现使用更方便的SeekBar
Android技术分享| 自定义View实现使用更方便的SeekBar
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印内容带有文件文件名方法名行号 等信息,方便定位日志输出的地方
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印内容带有文件文件名方法名行号 等信息,方便定位日志输出的地方