开发者

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜