我正在使用XmlPullParser解析Xml。我只是想处理Xml标签和它们中包含的文本,但是,XmlPullParser读取标签之间的空白文本(空格和回车)。它可以设置为忽略这个空格吗?
答案 0 :(得分:1)
我之前没有使用过XmlPullParser(如果这是完全错误的话,请道歉)但是只要看一下javadoc就好了,看起来当你调用nextToken()时,你必须查看返回值并跳过超过IGNORABLE_WHITESPACE。
以下内容不合适(感谢Jeff): BTW您是否被迫使用XmlPullParser?根据您尝试实现的声音,我会考虑更高级别的API,例如Simple。我通常使用JAXB,但这不是选择哈哈。
答案 1 :(得分:1)
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
}
祝你好运
答案 2 :(得分:0)
自己寻找解决方案后添加迟到的答案。
解析器有isWhiteSpace()
方法。它只能在与文本相关的事件类型上调用(例如TEXT
,CDSECT
,IGNORABLE_WHITESPACE
),否则会抛出。
您可以通过调用提升解析器的next
或getEventType
来获取事件类型。
调用next
会自动跳过IGNORABLE_WHITESPACE
事件。仅在调用nextToken
时才会触发此事件类型,该 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);
更精细并且会触及所有事件类型。即使我们通过调用next来跳过“可忽略的”空格,解析器仍然发现几乎所有的空白都是不可签名的,因此需要您允许跳过它。
<article-component>
<div ngSwitch="article.type">
<template-a *ngSwitchCase="a" [article]="article">
</template-a>
<template-b *ngSwitchCase="b" [article]="article">
</template-b>
<template-c *ngSwitchCase="c" [article]="article">
</template-c>
</div>
</article-component>