我想编辑现有的XML文件,同时保留其原始布局。这包括新行,注释等。编辑包括在XML中查找元素和修改文本值。
我的第一次尝试是将XMLParser与XmlUtil.serialize一起使用,但这不符合要求。
任何人都知道XMLParser的任何替代方法,其中编辑是原始XML字符串的“到位”?如果没有,也许有一个库使用XPath / GPath执行搜索,只返回查找的位置,所以我可以做StringBuilder.replace。
修改:
现在我做了这个函数,找到XML节点的字符串索引(我可以用xpath找到),然后我在索引上做替换。适用于简单节点 <节点>值LT; /节点>:
def find_location_by_node(xmlString, root_xml, node)
{
current_index = 0;
for(current_node in root_xml.depthFirst())
{
node_name = current_node.name().getLocalPart()
current_index = xmlString.indexOf('<' + node_name, current_index);
if(current_node == node)
{
end_tag = '</' + node_name + '>';
end_tag_index = xmlString.indexOf(end_tag, current_index) + end_tag.length();
return [current_index, end_tag_index];
}
}
return -1;
}
答案 0 :(得分:12)
你可以update your XML with DOMCategory。 DOM将保留原始布局。
import groovy.xml.DOMBuilder
def input = '''
<shopping>
<category type="groceries">
<item>Chocolate</item>
<item>Coffee</item>
</category>
<category type="supplies">
<item>Paper</item>
<item quantity="4">Pens</item>
</category>
<category type="present">
<item when="Aug 10">Kathryn's Birthday</item>
<item>Chocolate</item>
</category>
</shopping>
'''
def doc = DOMBuilder.parse(new StringReader(input))
def root = doc.documentElement
use(groovy.xml.dom.DOMCategory) {
def chocolate = root.depthFirst().grep{it.text() == "Chocolate"}
chocolate*.value = "Nutella"
}
def result = groovy.xml.dom.DOMUtil.serialize(root)
println result