Scala XMLEventReader为单个标记生成两个EvText事件

Scala XMLEventReader为单个标记生成两个EvText事件,scala,xml-parsing,Scala,Xml Parsing,我在scala xml事件阅读器中发现了一个奇怪的行为。对于这样的xml: <page> <title>AT&amp;T Bell Labs</title> <ns>0</ns> <id>63739</id> </page> 作为上述代码的结果,我得到了输出 AT T Bell Labs 而不是AT&;T Bell Labs实体引用事件由它们自己的

我在scala xml事件阅读器中发现了一个奇怪的行为。对于这样的xml:

  <page>
    <title>AT&amp;T Bell Labs</title>
    <ns>0</ns>
    <id>63739</id>
  </page>
作为上述代码的结果,我得到了输出

AT 
 T Bell Labs

而不是
AT&;T Bell Labs

实体引用事件由它们自己的构造函数表示(通常,如果我没记错的话,您不应该指望由单个
EvText
事件表示连续字符)

下面是我在过去某个时候编写的一些丑陋的命令式代码,用于处理这两种文本事件:

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
}
def readText(读取器:迭代器[XMLEvent]):字符串={
val builder=新的StringBuilder
var current=reader.next
当(
当前匹配{
case EvText(text)=>builder.append(text);true
case EvEntityRef(“amp”)=>builder.append(&);true
case EvEntityRef(“lt”)=>builder.append(“”);true
大小写=>false
}
)当前=reader.next
builder.toString
}
请注意,这会烧掉第一个非文本事件(我想?谁知道这是一种你永远都不想再读的代码),通常是令人不快的,但它会让你知道如何处理这种事情


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
}