1

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
...

ID、sID、d1が必要です。

私が得るもの:

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>

私が欲しいもの:

<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>

それは私のコードの一部です:

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)
                    }
                }
            }
        }

できるだけシンプルにしたいと思います。したがって、必要なのは、「ここで新しいregExIdを開始し、次に新しいxml-blockを開始する」のようなステートメントです。これにより、必要に応じてデータの新しい部分(d2など)を簡単に追加できます。既存のxmlファイルはありません。
情報ありがとうございます!

4

1 に答える 1

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
于 2012-04-12T14:30:32.023 に答える