实体引用事件由它们自己的构造函数EvEntityRefEvText表示(如果我没记错的话,通常你不应该指望由单个事件表示的连续字符)。
这是我过去编写的一些难看的命令式代码,用于处理这两种文本事件:
def readText(reader: Iterator[XMLEvent]): String = {
val builder = new StringBuilder
var current = reader.next
while (
current match {
case EvText(text) => builder.append(text); true
case EvEntityRef("amp") => builder.append("&"); true
case EvEntityRef("lt") => builder.append("<"); true
case EvEntityRef("gt") => builder.append(">"); true
case _ => false
}
) current = reader.next
builder.toString
}
请注意,这会烧掉第一个非文本事件(我认为?谁知道——这是您永远不想再阅读的那种代码),并且通常令人不快,但它应该让您了解如何处理这种事情。