xml - 如何使用 XMLSlurper 修改 XML 节点属性
问题描述
我正在尝试重命名父节点和子节点并编写类似这样的代码,
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>
我无法删除父(结果集)标签,而不是传递值“DE”或“0001”,我需要动态获取它。你能帮我完成这个吗
解决方案
以下代码:
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 文档,如上面的代码所示。
推荐阅读
- powerbi - DAX移动平均线不起作用
- angular - ChangeDetectionStrategy.OnPush 打破了 ControlValueAccessor 的禁用状态
- c# - 动态更改连接字符串以创建数据库并将创建的文件存储在特定文件夹中
- c - 使用时间戳计数器和 clock_gettime 进行缓存未命中
- python - 为什么 FFT 结果显示单个频率样本的 2 个非零幅度?
- jira - 使用解决日期返回特定日期的问题状态的 Jira 查询
- amazon-web-services - AWS CloudFormation:此区域(伦敦)不支持 CREATE_FAILED DBSecurityGroup
- javascript - Google AMP:如何在 AMP 中进行无限滚动?
- ansible - ansible playbook 默认与管理员用户连接
- google-cloud-platform - 是否可以在“project-b”中部署后台功能“myBgFunctionInProjectB”并由“project-a”中的我的主题“my-topic-project-a”触发