使用Groovy将父节点添加到XML

时间:2017-12-13 04:24:10

标签: xml groovy nodes

我需要将父节点插入到现有的XML中。我找到了如何将子节点添加到父节点但没有向xml添加新根节点的示例。 我的源XML是

<?xml version="1.0" encoding="UTF-8" ?>
<Cars>
    <Car>
        <Make>Hyundai</Make>
        <Model>Accent</Model>
        <Year>2016</Year>
    </Car>
    <Car>
        <Make>Mitsubishi</Make>
        <Model>Mirage</Model>
        <Year>2016</Year>
    </Car>
    <Car>
        <Make>Ford</Make>
        <Model>Fiesta</Model>
        <Year>2017</Year>
    </Car>
</Cars>

我的新XML应该是这样的:

<?xml version="1.0" encoding="UTF-8" ?>
<List_Wrappers>
    <Cars>
        <Car>
            <Make>Hyundai</Make>
            <Model>Accent</Model>
            <Year>2016</Year>
        </Car>
        <Car>
            <Make>Mitsubishi</Make>
            <Model>Mirage</Model>
            <Year>2016</Year>
        </Car>
        <Car>
            <Make>Ford</Make>
            <Model>Fiesta</Model>
            <Year>2017</Year>
        </Car>
    </Cars>
</List_Wrappers>

我是groovy的新手。我的意思是这样做:

class Test {
    static stringXML = "C:/Users/xyz/original.xml"

    static main(args) {

        def baseXML = new XmlSlurper().parse(new File(stringXML))         
        baseXML.cars.parent.appendNode('List_Wrapper')        
        def writer = new FileWriter("C:/Users/xyz/updated.xml")
        groovy.xml.XmlUtil.serialize( baseXML,writer )      
    }
}

但是,标签没有被添加,但我修改的XML结果是这样的:

<?xml version="1.0" encoding="UTF-8" ?>
<tag0:Cars>
    <tag0:Car>
        <tag0:Make>Hyundai</tag0:Make>
        <tag0:Model>Accent</tag0:Model>
        <tag0:Year>2016</tag0:Year>
    </tag0:Car>
    <tag0:Car>
        <tag0:Make>Mitsubishi</tag0:Make>
        <tag0:Model>Mirage</tag0:Model>
        <tag0:Year>2016</tag0:Year>
    </tag0:Car>
    <tag0:Car>
        <tag0:Make>Ford</tag0:Make>
        <tag0:Model>Fiesta</tag0:Model>
        <tag0:Year>2017</tag0:Year>
    </tag0:Car>
</tag0:Cars>

需要帮助解决这个问题。

1 个答案:

答案 0 :(得分:0)

代码中的行:

baseXML.cars.parent.appendNode('List_Wrapper')

  • Cars是您的根节点。您不能将其baseXML.Cars

  • 您无法进行root.parent

试试这段代码,它将满足您的要求,

def newXml = new groovy.xml.StreamingMarkupBuilder().bind {

List_Wrapper {

    mkp.yield baseXML

    }
}
println groovy.xml.XmlUtil.serialize(newXml)

更新1:

使用XmlParser()如下所示,def baseXML = new XmlParser().parse(new File(stringXML))以避免tag0问题。

(或)

修改:
def baseXML = new XmlSlurper(false,false).parseText(new File(stringXML).getText())