Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy编辑XML文件,保留注释,换行符_Xml_Groovy - Fatal编程技术网

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

Groovy编辑XML文件,保留注释,换行符,xml,groovy,Xml,Groovy,我想编辑现有的XML文件,同时保留其原始布局。这包括新行、注释等。编辑包括在XML中查找元素和修改文本值 我的第一次尝试是将XMLParser与XmlUtil.serialize一起使用,但这不符合要求 有人知道XMLParser的任何替代方案,其中的编辑是对原始XML字符串的“就地”编辑吗?如果没有,可能有一个库使用XPath/GPath执行搜索,只返回查找的位置,这样我就可以执行StringBuilder.replace 编辑: 现在,我创建了这个函数,以查找XML节点的字符串索引(我可以使

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

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

有人知道XMLParser的任何替代方案,其中的编辑是对原始XML字符串的“就地”编辑吗?如果没有,可能有一个库使用XPath/GPath执行搜索,只返回查找的位置,这样我就可以执行StringBuilder.replace

编辑

现在,我创建了这个函数,以查找XML节点的字符串索引(我可以使用xpath查找),然后对索引进行替换。适用于简单节点 价值:

def按节点查找位置(xmlString,root\u xml,node)
{
当前_指数=0;
for(根目录下的当前\u节点\u xml.depthFirst())
{
node_name=当前_node.name().getLocalPart()
current_index=xmlString.indexOf(“您可以这样做。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
导入groovy.xml.DOMBuilder
def输入=“”
巧克力
咖啡
纸张
钢笔
凯瑟琳的生日
巧克力
'''
def doc=domguilder.parse(新的StringReader(输入))
def root=doc.documentElement
使用(groovy.xml.dom.domcegory){
def chocolate=root.depthFirst().grep{it.text()=“chocolate”}
巧克力*.value=“Nutella”
}
def result=groovy.xml.dom.DOMUtil.serialize(根)
打印结果

groovy.xml.dom.DOMUtil不在groovy 1.8及更高版本中。要保存groovy.xml.XmlUtil.serialize(root),必须使用。这将保留格式,但丢失注释。要保留xml中的注释,请查看此处:
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