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

时间:2013-05-16 15:20:00

标签: scala xml-parsing

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

  <page>
    <title>AT&amp;T Bell Labs</title>
    <ns>0</ns>
    <id>63739</id>
  </page>

它为标题的EvText事件生成,因为它包含&amp;。

的特殊xml编码
case EvText( text ) =>
{
  println(text)
}

作为上面代码的结果,我得到了输出

AT 
 T Bell Labs

而不是AT&amp;T Bell Labs

1 个答案:

答案 0 :(得分:3)

实体引用事件由它们自己的构造函数EvEntityRef表示(一般情况下,如果我没记错的话,你不应指望连续的字符由单个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
}

请注意,这会烧掉第一个非文本事件(我想?谁知道 - 这是你再也不想读的那种代码),并且通常很不愉快,但它应该会让你知道如何你可以处理这种事情。