【发布时间】:2018-02-12 03:36:40
【问题描述】:
我在 Spock 规范(无 Robolectric)中使用 KXmlParser 来解析 Android strings.xml 文件。我间歇性地得到以下跟踪:
java.lang.NoSuchMethodError: java.lang.System.arraycopy([CI[CII)V
at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1509)
at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:1001)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:448)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
知道有什么问题吗?
这是我的 ext 属性:
minSdkVersion = 19
targetSdkVersion = 26
compileSdkVersion = 26
buildToolsVersion = '26.0.2'
这里是sn-p的代码:
try (FileInputStream in = new FileInputStream("app/src/main/res/values/strings.xml")) {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(in, null);
AndroidStringResource resource = null;
int eventType = parser.getEventType();
while (eventType != parser.END_DOCUMENT) {
eventType = parser.next();
if (eventType == parser.START_TAG) {
if (parser.getName().equals("string")) {
resource = new AndroidStringResource();
resource.name = parser.getAttributeValue(null, "name");
resource.context = parser.getAttributeValue(null, "context");
String maxLengthStr = parser.getAttributeValue(null, "maxLength");
resource.maxLength = (maxLengthStr == null) ? -1 : Integer.parseInt(maxLengthStr);
}
} else if (eventType == parser.TEXT) {
if (resource != null) {
resource.value = parser.getText();
}
} else if (eventType == parser.END_TAG) {
if (parser.getName().equals("string")) {
if (!resourceNameToServerKeyMap.containsKey(resource.name)) {
androidStringResourceMap.put(resource.name, resource);
}
resource = null;
}
}
}
}
请注意,我正在向我的 strings.xml 中的元素添加自定义 XML 属性。这是一个例子:
<resources>
<string name="app_name" maxLength="30">myapp</string>
</resources>
一个 MVCE 可重现的测试用例可用here。
【问题讨论】:
-
能否请您发布更多有关如何尝试获取和解析的代码。
-
已更新。谢谢@SankarGanesh
-
您能否确认您能够设置资源对象的字段名称和上下文的值。除此之外,请让我知道在哪一行抛出异常?
-
这个问题值得标记 spock 怎么样?但无论如何,你的问题当然值得回答。我认为,如果您提供带有可执行代码和完整 XML 属性文件的 MCVE,您更有可能得到一个好的。
-
@SankarGanesh resource.name 始终设置。仅当
元素上存在自定义上下文属性时,才会设置 resource.context。上面代码中导致异常的行是“eventType = parser.next();”循环中的第一行。我包含 spock 的原因是,如果它提取了错误版本的依赖项,它可能是相关的。我已经删除了标签。
标签: java android spock robolectric xmlpullparser