我在 Scala xml 事件阅读器中发现了一个奇怪的行为。对于这样的 xml:
<page>
<title>AT&T Bell Labs</title>
<ns>0</ns>
<id>63739</id>
</page>
它为标题生成 EvText 事件,因为它包含 & 的特殊 xml 编码。
case EvText( text ) =>
{
println(text)
}
作为上面代码的结果,我得到了输出
AT
T Bell Labs
而不是
AT&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/