我在一个 Android 应用程序中有一些 XML,其中 XmlPullParser 是将 XML 绑定到数据模型类的推荐解决方案。XmlPullParser 的 Android 文档相当不错,除了如何处理元素间空白。推荐的方法是检测低级 IGNORABLE_WHITESPACE 解析事件并跳过这些事件。但是对于我试图接受的 XML,这种方法对我不起作用。我从来没有看到发生过低级别的 IGNORABLE_WHITESPACE 事件。这让我相信我没有正确理解我的特定用例的某些方面,无论是 XmlPullParser 行为、可接受的 XML,还是可能的配置问题。
我试图接受的 XML 片段的简化测试用例是:
<a> <b></b> </a>
我使用推荐的 getNextToken() 方法来接受这个元素的代码破解是:
boolean hasEvent = false;
String desc = null;
while (!hasEvent) {
result = xpp.nextToken();
desc = xpp.getPositionDescription();
Log.i(TAG, String.format("Processing: %s", desc));
switch (result) {
case START_TAG:
case END_TAG:
case END_DOCUMENT:
hasEvent = true;
break;
case TEXT:
// Use a real hack to detect whitespace.
if (desc.contains("TEXT (whitespace)@")) {
hasEvent = false;
} else {
hasEvent = true;
}
break;
default:
break;
}
}
我看到的结果基本上是:得到 START_TAG(a),得到 TEXT(空白),得到 START_TAG(b),得到 END_TAG(b),得到 TEXT(空白),得到 END_TAG(a)。
所以问题是:我没有正确理解什么?我如何接受这个序列而不诉诸丑陋的黑客,这更符合推荐使用 XmlPullParser。
我有一种预感,这是有问题的 XML,但它代表了我将要呈现的内容,即我无法控制输入流中的元素间空白。
fwiw,XML 的简单框架可以毫无问题地处理这个输入流,这是我的首选方法,但是由于与底层 stax 和 epp 库的依赖冲突,该包与 Gradle 和 Android Studio 一起使用非常非常混乱,但那是完全是另一个问题。