Groovy XML редактировать значение вызывает дублирование - PullRequest
1 голос
/ 19 июля 2010

С помощью небольшой помощи daviderossi.blogspot.com мне удалось заставить работать некоторый код для замены значения xml другим.Это дает мне следующий вывод, который оба редактирует значение в позиции 'ix', НО также добавляет вторую копию в конце.Если я ищу его с помощью LastIndexOf и удаляю его, он удаляет первое вхождение.Любые идеи о том, почему код может делать это, или как смягчить этот нежелательный эффект?

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 XmlNodePrinter(new PrintWriter(writer)).print(xml)
result = writer.toString()

РЕЗУЛЬТАТ

<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>

1 Ответ

1 голос
/ 19 июля 2010

Использование класса Groovy XMLSlurper для работы с вашим XML упрощает ваш код и улучшает удобочитаемость.Я создал образец скрипта в Groovy Console, где вы можете оценить это:

Пример кода

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​)​

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...