如何解决XMLStream Reader Scala-END_DOCUMENT的正确处理
我实际上是在重组现有的大型软件,并从XMLEventReader
切换到
XMLStreamReader
用于提高内存效率。
def evalStreamReader(source: StreamSource): Unit
val StreamReader = XMLInputFactory.newInstance().createXMLStreamReader(source)
while (StreamReader.hasNext) {
val eventType = StreamReader.getEventType
eventType match {
case 1 => println("Start Element " + eventType + " : " + StreamReader.getLocalName)
case 2 => println("End Element " + eventType + " : " + StreamReader.getLocalName)
case 4 => println("Characters " + eventType + " : " + StreamReader.getText)
case 7 => println("Start Document " + eventType)
case 8 => println("End Document: " + eventType)
}
StreamReader.next()
}
}
和简单的XML文件:
<a>
<c></c>
</a>
输出为:
Start Document 7
Start Element 1 : a
Characters 4 :
Start Element 1 : c
End Element 2 : c
Characters 4 :
End Element 2 : a
无论如何,我是否可以在END_DOCUMENT
条件/大小写匹配内而不是在循环之外单独/正确地处理事件While
?我尝试了许多条件,但do while
却没有成功。
想法是StreamReader.next()
将在END_DOCUMENT
事件中切换光标,而hasNext
将根据API中的定义返回false:
boolean hasNext()
throws XMLStreamException
Returns true if there are more parsing events and false if there are no more events.
This method will return false if the current state of the XMLStreamReader is END_DOCUMENT
解决方法
一种简单的非惯用方法:
def evalStreamReader(source: StreamSource): Unit = {
val streamReader: XMLStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(source)
var finished: Boolean = false
do {
val eventType = streamReader.getEventType
if (eventType != 8) {
eventType match {
case 1 => println("Start Element " + eventType + " : " + streamReader.getLocalName)
case 2 => println("End Element " + eventType + " : " + streamReader.getLocalName)
case 4 => println("Characters " + eventType + " : " + streamReader.getText)
case 7 => println("Start Document " + eventType)
}
streamReader.next()
} else {
println("End Document: " + eventType)
finished = true
}
} while(!finished)
streamReader.close()
}
它将输出:
Start Document 7
Start Element 1 : a
Characters 4 :
Start Element 1 : c
End Element 2 : c
Characters 4 :
End Element 2 : a
End Document: 8
基本上,您需要将流控制与阅读器分开。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。