Groovy编辑XML文件,保留注释,换行符

mbd*_*dev 9 xml groovy

我想编辑现有的XML文件,同时保留它的原始布局.这包括新行,注释等.编辑包括在XML中查找元素和修改文本值.

我的第一次尝试是将XMLParser与XmlUtil.serialize一起使用,但这不符合要求.

任何人都知道XMLParser的任何替代方法,其中编辑是原始XML字符串的"到位"?如果没有,也许有一个库使用XPath/GPath执行搜索,只返回查找的位置,所以我可以做StringBuilder.replace.

编辑:

现在我做了这个函数,找到XML节点的字符串索引(我可以使用xpath找到),然后我在索引上进行替换.适用于简单节点<node> value </ node>:

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;
}
Run Code Online (Sandbox Code Playgroud)

roc*_*chb 13

您可以使用DOMCategory更新XML.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
Run Code Online (Sandbox Code Playgroud)

  • groovy.xml.dom.DOMUtil不在groovy 1.8及更高版本中.为了保存groovy.xml.XmlUtil.serialize(root)必须使用. (3认同)