我正在使用 XmlPullParser 解析 Xml。我只想处理 Xml 标签和其中包含的文本,但是 XmlPullParser 读取标签之间的空白文本(空格和回车)。可以设置为忽略这个空格吗?
3 回答
我以前没有使用过 XmlPullParser (如果这是完全错误的,请道歉)但是看一下javadocs,看起来当你调用nextToken()时,你必须查看返回值并跳过IGNORABLE_WHITESPACE。
以下是不合适的(感谢Jeff):顺便说一句,您是否被迫使用 XmlPullParser?根据您想要实现的目标,我会考虑使用更高级别的 API,例如Simple。我通常使用JAXB,但这不是选择哈哈。
IDK 如果有忽略空白的设置。如果您将当前节点作为字符串跟踪,则可以编写代码以忽略空格。如果当前节点为空,则忽略文本。我的测试显示它只是转义换行等。我围绕它进行了如下优化。 危险 这适用于我正在使用的 xml 它可能不适用于你的
String N=""; // Yes I know its Capitalized but its the Current Node and very important to keep track of.
if (eventType == XmlPullParser.START_TAG) {
N = xpp.getName();//save the name of the node.
...
} else if (eventType == XmlPullParser.END_TAG) {
N = "";//clear the name of the node.
} else if (eventType == XmlPullParser.TEXT) {
//if the name of the node is not blank then process it
if (!N.equals("")) {
//I have a node so process it
}
祝你好运
在自己寻找解决方案后添加一个迟到的答案。
解析器有一个isWhiteSpace()
方法。它只能在与文本相关的事件类型(例如TEXT
, CDSECT
, IGNORABLE_WHITESPACE
)上调用,否则会抛出。
您可以通过调用next
推进解析器或getEventType
.
调用next
会自动跳过IGNORABLE_WHITESPACE
事件。此事件类型仅在调用nextToken
更细粒度并命中所有事件类型时才会被命中。即使我们通过调用 next 跳过了“可忽略”的空白,解析器仍然发现几乎所有的空白都是不可忽略的,因此需要您允许跳过它。
boolean isEoD = false;
do{
switch (parser.next()){
default:
break;
case XmlPullParser.TEXT:
if(!parser.isWhitespace()) //Throws if called on wrong eventType
System.out.println("Text: " + parser.getText());
break;
case XmlPullParser.START_TAG:
case XmlPullParser.END_TAG:
System.out.println("TAG: " + parser.getName()+ "\n");
break;
case XmlPullParser.END_DOCUMENT:
isEoD = true;
}
}while(!isEoD);