3

XMLSlurper を、非常に大きな XML ドキュメントから個々のサブツリーを取り出して個別に処理できるような方法で利用できるかどうかを知っている人はいますか?

個別に処理できる数千の直接の子要素を持つルート要素を含む巨大な XML フィードがあるとします。明らかに、ドキュメント全体をメモリに読み込むことはできませんが、ルートの各子自体は適度なサイズであるため、ドキュメントをストリーミングして、XMLSlurper のナイスネスを各子要素に順番に適用するとよいでしょう。各子要素が処理されると、ガベージ コレクションによって、その処理に使用されたメモリがクリーンアップされる可能性があります。このようにして、ストリーミング (SAX など) の少ないメモリ フットプリントで XMLSlurper (このような簡潔な構文) を非常に簡単に利用できます。

誰かがこれについてアイデアを持っているかどうか、および/または自分でこの要件に出くわしたかどうかを知りたいです。

4

2 に答える 2

2

インスタンスの初期化とは、そのオーバーロードされたメソッド (またはメソッド) のXmlSlurper1 つを呼び出すことを意味します。この呼び出し時に、XmlSlurper は (少なくとも SAX イベントを使用して) XML 要素と属性、およびそれらの構造に関する完全な情報を保持するインメモリを構築します。parse(..)parseText(String)GPathResult

したがって、いいえ、XML ドキュメントの部分のみを解析するための API は提供されXmlSlurperません。

できることは、メソッドの上書き、カスタム SAX ハンドラーを使用しextendた XML の前処理、XMLの必要な部分の収集、およびこれらのメソッドの 1 つへの転送です。XmlSlurperparse*(..)XmlSlurper.parse*(..)

于 2010-11-05T13:02:59.450 に答える
2

StAX API を と一緒に使用してXmlSlurper、サブツリーを解析できます。

// Example of using StAX to split a large XML document and parse a single element using XmlSlurper

import javax.xml.stream.XMLInputFactory
import javax.xml.stream.XMLStreamReader
import javax.xml.transform.Transformer
import javax.xml.transform.TransformerFactory
import javax.xml.transform.sax.SAXResult
import javax.xml.transform.stax.StAXSource

def url = new URL("http://repo2.maven.org/maven2/archetype-catalog.xml")
url.withInputStream { inputStream ->
    def xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream)
    def transformer = TransformerFactory.newInstance().newTransformer()
    while (xmlStreamReader.hasNext()) {
        xmlStreamReader.next()
        if (xmlStreamReader.isStartElement() && xmlStreamReader.getLocalName() == 'archetype') {
            // Example of splitting a large XML document and parsing a single element with XmlSlurper at a time
            def xmlSlurper = new XmlSlurper()
            transformer.transform(new StAXSource(xmlStreamReader), new SAXResult(xmlSlurper))
            def archetype = xmlSlurper.document
            println "${archetype.groupId} ${archetype.artifactId} ${archetype.version}"
        }
    }
}
于 2016-02-09T16:20:57.573 に答える