问题描述
我实际上是在重组现有的大型软件,并从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
基本上,您需要将流控制与阅读器分开。