2012-04-12 3 views
1

GroovyでXML解析の問題が少しあります。私はID、SIDとD1が必要Groovy:新しいXML構造の作成とビルド中に新しいノードを挿入する方法

ID  001=1234 
sID  001=q8b6v 
d1  001=some Text 
d2  001=more Text2 
tzh  001=data 
dse  001=data 
ID  001=567823 
sID  001=l3n37v2 
d1  001=some Text 
d2  001=more Text2 
hrg  001=data 
dfe  001=data 
... 


これは私のようなデータが見えるもの、です。私はできるだけ単純にそれを維持したい

if(!dataFile.exists()){ 
     println "File does not exist!" 
    }else{ 

     def key1, key2, key3, key4 
     def val1, val2, val3, val4 

     xml.add{ 
      doc { 
       dataFile.eachLine {line -> 
        if(line.startsWith(regExId)){ 
         (key1, val1) = line.split(/001=/).collect {it.trim()} 
         field(name:key1, val1) 
        } 
        if(line.startsWith(regExEntryId)){ 
         (key2, val2) = line.split(/001=/).collect {it.trim()} 
         field(name:key2, val2) 
        } 
        if(line.startsWith(regExTitle)){ 
         (key3, val3) = line.split(/001=/).collect {it.trim()} 
         field(name:key3, val3) 
        } 
       } 
      } 
     } 

:私のコードの一部だ

<add> 
    <doc> 
    <field name='ID'>00573419</field> 
    <field name='sID'>20120110572</field> 
    <field name='d1'>some Text</field> 
    </doc> 
    <doc> 
    <field name='ID'>00573406</field> 
    <field name='sID'>20120111110</field> 
    <field name='d1'>some Text2</field> 
    </doc> 
</add> 

:私が欲しいもの

What I get: 
<add> 
    <doc> 
    <field name='ID'>00573419</field> 
    <field name='sID'>20120110572</field> 
    <field name='d1'>some Text</field> 
    <field name='ID'>00573406</field> 
    <field name='sID'>20120111110</field> 
    <field name='d1'>some Text2</field> 
    </doc> 
</add> 

:私は何を得る

。だから私が必要とするのは、「ここで新しいregExIdを起動して新しいxmlブロックを開始する」というようなステートメントで、必要に応じてデータの新しい部分(d2など)を簡単に追加できるようにすることです。既存のXMLファイルはありません。
ありがとうございました!

+0

あなたのデータは、各行の末尾に ''
を持っていますか? –

+0

私はこれを見ています...いいえ、それは各行の最後に
を持っていませんか? – Dave

+0

その部分を編集しました。ありがとうございます。今それは正しいはずです。 – Dave

答えて

1

これは私が思いついたものです:

import groovy.xml.MarkupBuilder 

dataFile = new File('data.txt') 

// A closure that will add a new doc element to our xml 
def addDoc = { builder, data -> 
    builder.doc { 
    data.each { k, v -> 
     builder.field(name:k, v) 
    } 
    } 
} 


String result = new StringWriter().with { out -> // create a StringWriter 
    new MarkupBuilder(out).with { xml ->   // pass it to MarkupBuilder 
    add {          // create our root level element 
     def data = [:] 
     // Then, for each line in our input file 
     dataFile.eachLine { line -> 
     // Get the key and value as you had it 
     def (key,value) = line.split(/001=/)*.trim() 
     // Just use the keys we want 
     if(key in [ 'ID', 'sID', 'd1' ]) { 
      // If we have a new ID and we have data 
      if(key == 'ID' && data) { 
      // Add it to the document 
      addDoc(xml, data) 
      // And start again with a new map 
      data = [ ID: value ] 
      } 
      else { 
      // Otherwise, just add the key to the map 
      data[ key ] = value 
      } 
     } 
     } 
     // So, we've run out of lines. If we have data, write it in 
     if(data) addDoc(xml, data) 
    } 
    } 
    // Convert our StringWriter to a String (this goes into the variable `result) 
    out.toString() 
} 
// And print it out 
println result 
+0

ちょうど "うわー"!ありがとう!私は多くを学ぶ:)結果は正しいです。 1つの質問のみ: 'data = [ID:value]' IDはどこから来たのですか? – Dave

+0

@ user1095901これは、新しい地図エントリのキーです(私たちが知っているように 'ID')...' data = [(key):value] 'を置くのはあまり混乱しないかもしれません。基本的には、新しいIDを地図に書き込んで次回に書類に書いています –

+0

あなたの素早い対応のためにありがとうございます。私は解決されたとして私の質問をマークします。ありがとうございました。 – Dave

関連する問題