2016-09-14 5 views
1

XmlSlurperまたはXmlParserを使用してXML変換を行うことができます。しかし、私は他の解決策を探しています。なぜなら、私は1GB以上のサイズのXMLファイルを持っている可能性があり、SAX Parserはそれを処理できない可能性があるからです。GroovyでSAXパーサの実装を使用せずにXMLを効率的に変換

INPUT:(Before transformation) 
<response version-api="2.0"> 
<value> 
<ErrorCodes>1, 2, 3, 4</ErrorCodes> 
</value> 
</response> 

OUTPUT:(After Transformation) 
<response version-api='2.0'> 
<value> 
<ErrorCode>1</ErrorCode> 
<ErrorCode>2</ErrorCode> 
<ErrorCode>3</ErrorCode> 
<ErrorCode>4</ErrorCode> 
</value> 
</response> 
+1

経験から、SAXは大量のペイロードをうまく扱うことができます。 – Aelexe

答えて

0

ここでは言及されているような単純なスクリプトです。

コメントをインラインで見つけてください:

import groovy.xml.XmlUtil 
def xml = '''<response version-api="2.0"> 
    <value> 
     <ErrorCodes>1, 2, 3, 4</ErrorCodes> 
    </value> 
</response>''' 
def newXml = new XmlSlurper().parseText(xml) 
//Get the current Error codes into a list 
def codes = newXml.value.ErrorCodes.toString().split(',')*.trim() 
//remove the existing ErrorCodes node 
newXml.value.ErrorCodes.replaceNode {} 
//Create the transformed xml by adding the list of ErrorCodes 
newXml.value.appendNode { 
    codes.each { 
     ErrorCodes(it) 
    } 
} 
println XmlUtil.serialize(newXml) 

あなたはgroovy web console

UPDATEからスクリプトを試すことができます。

私は問題のタイプミスを修正されました。

ユーザーはXmlSlurperを使用したくありませんか?後で実現する。

別の方法では、stylesheetを使用して変換することができます。

さまざまな方法で時間がかかることがあります。リンクの

見つかりカップル:

1

Groovy APIは1GB以上のXMLファイルでは遅延評価を使用しますが、StAXを考慮する必要があります。 SAXのようにコールバック駆動されるのではなく、イテレータを使用するストリーミングAPIであり、コードの記述方法の柔軟性が向上します。

あなたの例をもう一度見てみると、groovy StreamingMarkupBuilderまたはMarkupBuilderクラスを実際に使用すると恩恵を受けるでしょう。前者はこのような大きな文書の方が良いと思われます。これらは非常に使いやすく、変換ロジックとStAXを混在させる優れた方法です。

関連する問題