如何使用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”,而是需要动态获取它。你能帮我完成这个吗

解决方法

以下代码:

plt.scatter(record_high.Date.values,record_high.Data_Value.values,color='red')
plt.scatter(record_low.Date.values,record_low.Data_Value.values,color='blue',s=8)
plt.xlabel('Date',fontsize=10)
plt.ylabel('° Celsius',fontsize=10)
plt.title('Temperature in Ann Arbour,Michigan (2005-2015)',fontsize=12)
plt.legend(['Record high (2005-2014)','Record low (2005-2014)','Record breaking high in 2015','Record breaking low in 2015'],loc=0,frameon=False)
 
plt.fill_between(x=date_index,y1=max_temp,y2=min_temp,facecolor='grey',alpha=0.25)

运行时,将产生以下输出:

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

我认为它与您要创建的内容非常接近。通常,如果您要进行转换,而不仅仅是删除节点,那么像上面的代码中那样,创建一个全新的xml文档会变得更加容易。