scala - XMLEventReader 为单个标签生成两个 EvText 事件

标签 scala xml-parsing

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

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

它为标题生成 EvText 事件,因为它包含 & 的特殊 xml 编码。
case EvText( text ) =>
{
  println(text)
}

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

而不是 AT&amp;T Bell Labs .

最佳答案

实体引用事件由它们自己的构造函数表示,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
}

请注意,这会烧掉第一个非文本事件(我想?谁知道呢——这是一种你永远不想再读的代码),并且通常令人不快,但它应该让你知道如何处理这种事情。

关于scala - XMLEventReader 为单个标签生成两个 EvText 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16591404/

相关文章:

python - 使用具有奇数 xml 结构的 python 抓取 xml

scala:在父类和子类中覆盖构造函数中的隐式var?

scala - 循环遍历Scala中的元组列表

java - Scala 和 Java 数据结构

hadoop - Apache Pig中的SAX Parser支持

java - dom4j 文本函数的 XPath 解析失败

java - InputSource 和 InputStream 有什么区别?

java - 如何使用 JAXB 从给定的 XML 创建 POJO

scala - Scala 运行时的结构化等于

scala - 如何使用正确的名称在 scala 中对表进行分区