#xml #groovy
#xml #groovy
Вопрос:
Я пытаюсь переименовать родительский и дочерний узлы и закодировать что-то вроде этого,
def xml = (''' <resultset columns="13" rows="2">
<row number="1">
<enterpise>DE</enterpise>
<line>0001</line>
<name>DELL</name>
<version>0.01</version>
<updtae isnull="true"/>
</row>
<row number="2">
<enterpise>DF</enterpise>
<line>0002</line>
<name>DELL</name>
<version>0.01</version>
<updtae isnull="true"/>
</row>
</resultset>
''')
def resultset = new XmlSlurper().parseText(xml)
def record = resultset.record.find{ it.@columns=='13'}.each
{ p -> p.attributes().13('columns') }
resultset.row.replaceNode { row { tr { td("DE") } tr { td("0001") } } }
Ожидаемый результат
<Row ss:AutoFitHeight="0">
<tr><td ss:Type="String">DE</td></tr>
<tr><td ss:Type="Number">0001</td></tr>
<tr><td ss:Type="Sring">DELL</td></tr>
<tr><td ss:Type="Number">0.01</td></tr>
<tr><td ss:Type="String"></td></tr>
</Row>
<Row ss:AutoFitHeight="0">
<tr><td ss:Type="String">DF</td></tr>
<tr><td ss:Type="Number">0002</td></tr>
<tr><td ss:Type="Sring">DELL</td></tr>
<tr><td ss:Type="Number">0.01</td></tr>
<tr><td ss:Type="String"></td></tr>
</Row>
Я не могу удалить родительский тег (resultset), и вместо передачи значения ‘DE’ или ‘0001’ мне нужно получить его динамически. Можете ли вы, пожалуйста, помочь мне завершить это
Комментарии:
1. Вы можете использовать
replaceNode()
, пример здесь2. Я пробовал что-то подобное и смог изменить узел, но не смог удалить родительский тег (resultset). набор результатов определения = новый XMLSlurper().parseText(xml) запись определения = набор результатов.запись.найти{ it.@columns ==’13’}.каждый { p -> p.attributes().13(‘columns’) } resultset.row.replaceNode { строка { tr { td(«DE») } tr { td(«0001») } } } Также вместо передачи значения ‘DE’ или ‘0001’, мне нужно получить его динамически из тега строки. Не могли бы вы, пожалуйста, помочь мне в этом
3. Обновите свой вопрос своим кодом.
4. обновил код в вопросе сейчас
Ответ №1:
Следующий код:
import groovy.xml.*
def inData = '''
<resultset columns="13" rows="2">
<row number="1">
<enterpise>DE</enterpise>
<line>0001</line>
<name>DELL</name>
<version>0.01</version>
<updtae isnull="true"/>
</row>
<row number="2">
<enterpise>DF</enterpise>
<line>0002</line>
<name>DELL</name>
<version>0.01</version>
<updtae isnull="true"/>
</row>
</resultset>'''
def inXml = new XmlSlurper().parseText(inData)
def outData = new StringWriter()
def outXml = new MarkupBuilder(outData)
inXml.row.each { row ->
outXml.Row('ss:AutoFitHeights': 0) {
tr { td('ss:Type': 'String', row.enterpise) }
tr { td('ss:Type': 'Number', row.line) }
tr { td('ss:Type': 'String', row.name) }
tr { td('ss:Type': 'Number', row.version) }
tr { td('ss:Type': 'String') }
}
}
println outData
при запуске выдает следующий вывод:
─➤ groovy solution.groovy
output:
<Row ss:AutoFitHeights='0'>
<tr>
<td ss:Type='String'>DE</td>
</tr>
<tr>
<td ss:Type='Number'>0001</td>
</tr>
<tr>
<td ss:Type='String'>DELL</td>
</tr>
<tr>
<td ss:Type='Number'>0.01</td>
</tr>
<tr>
<td ss:Type='String' />
</tr>
</Row>
<Row ss:AutoFitHeights='0'>
<tr>
<td ss:Type='String'>DF</td>
</tr>
<tr>
<td ss:Type='Number'>0002</td>
</tr>
<tr>
<td ss:Type='String'>DELL</td>
</tr>
<tr>
<td ss:Type='Number'>0.01</td>
</tr>
<tr>
<td ss:Type='String' />
</tr>
</Row>
который, я думаю, довольно близок к тому, что вы пытаетесь создать. В общем, если вы пытаетесь выполнить преобразование, а не просто удалить узел, проще создать совершенно новый XML-документ, как в приведенном выше коде.
Комментарии:
1. Большое спасибо, это то, что я хочу на самом деле