0

实际上,我正在重组一个现有的大型软件,并出于内存效率的目的切换XMLEventReader到 。XMLStreamReader

考虑以下函数的定义,该函数当前仅读取 XML 事件并打印它们:

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
4

1 回答 1

1

一个简单的非惯用方法示例:

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

基本上你需要将流量控制与阅读器分开。

于 2020-11-10T11:57:53.733 回答