Groovy xml edit value causes duplicate
With more than a little help from daviderossi.blogspot.com I have managed to get some code working to replace an xml value with another
This give me the following output which both edits the value at the 'ix' position BUT also adds a second copy at the end. If I search for it with LastIndexOf and delete it then it deletes the first occurrence. Any ideas on why the code might be doing that, or how to mitigate this unwanted effect??def fm_xml = '''<?xml version="1.0" encoding="UTF-8"?>
<MAlong>
<Enquiry.ID>SC11147</Enquiry.ID>
<student.name_middle></student.name_middle>
<student.name_known></student.name_known>
<student.name_previous></student.name_previous>
<student.name_cert>John REnfrew</student.name_cert>
<student.detail_gender>M</student.detail_gender>
<student.sign_name>John Renfrew</student.sign_name>
<student.sign_date>05/01/2010</student.sign_date>
</MAlong>'''
xml = new XmlParser().parseText(fm_xml)
ix = xml.children().findIndexOf{it.name() =='student.name_middle'}
nn = new Node(xml, 'student.name_middle', "NEW")
if (ix != -1 ) {
xml.children()[ix] = nn
nn.parent = xml
}
writer = new StringWriter()
new XmlNodePrinte开发者_StackOverflowr(new PrintWriter(writer)).print(xml)
result = writer.toString()
RESULT
<MAlong>
<Enquiry.ID>
SC11147
</Enquiry.ID>
<student.name_middle>
NEW
</student.name_middle>
<student.name_known/>
<student.name_previous/>
<student.name_cert>
John REnfrew
</student.name_cert>
<student.detail_gender>
M
</student.detail_gender>
<student.sign_name>
John Renfrew
</student.sign_name>
<student.sign_date>
05/01/2010
</student.sign_date>
<student.name_middle>
NEW
</student.name_middle>
</MAlong>
Using the Groovy class XMLSlurper to work with your XML makes your code easier and improves readability. I created a sample script at the Groovy Console where you can evaluate this:
- http://groovyconsole.appspot.com/script/177001 (first version)
- http://groovyconsole.appspot.com/script/180001 (with pretty print)
Example-Code
import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil
def prettyprint(xml) {
XmlUtil.serialize(new StreamingMarkupBuilder().bind { mkp.yield xml })
}
def input = '''<?xml version="1.0" encoding="UTF-8"?><MAlong>
<Enquiry.ID>SC11147</Enquiry.ID>
<student.name_middle></student.name_middle>
<student.name_known></student.name_known>
<student.name_previous></student.name_previous>
<student.name_cert>John REnfrew</student.name_cert>
<student.detail_gender>M</student.detail_gender>
<student.sign_name>John Renfrew</student.sign_name>
<student.sign_date>05/01/2010</student.sign_date>
</MAlong>'''
def root = new XmlSlurper().parseText(input)
println "Input\n" + prettyprint(root)
// static way
root.'student.name_middle' = "MIDDLE NAME"
// variable way
root.setProperty("student.name_previous", "PREVIOUS NAME")
println "Output\n" + prettyprint(root)
Reference:
- http://groovy.codehaus.org/api/groovy/util/XmlSlurper.html
- http://groovy.codehaus.org/gapi/groovy/xml/StreamingMarkupBuilder.html
精彩评论