停止将嵌套值与XmlSlurper组合在一起

时间:2018-04-05 15:43:45

标签: xml groovy xmlslurper gpath

我正在尝试使用XmlSlurper解析XML文档。这个文档有很多嵌套元素,每个元素都有一个值。它遵循以下格式:

<XML version="1" title="cars" lot="23">
<Cars>
    <Car year="2012" color="black" engine="2.0L" drivetrain="FWD">Hyundai Sonata<Condition id="5">Excellent<Running>Yes</Running></Condition></Car>
    <Car year="2007" color="silver" engine="2.4L" drivetrain="AWD">Audi A4<Condition id="4">Good<Running>Sometimes</Running></Condition></Car>
    <Car year="2009" color="gray" engine="2.0L" drivetrain="FWD">Mitsubishi Lancer<Condition id="3">Fair<Running>Yes</Running></Condition></Car>
    <Car year="1996" color="green" engine="5.0L" drivetrain="4WD">Jeep Grand Cherokee<Condition id="3">Fair<Running>No</Running></Condition></Car>
</Cars>

我正在尝试打印每辆车的年份和品牌/型号,但是,当我运行我的代码时,它会打印品牌/型号,以及条件和运行的值,如下所示:

id: 2012
value: Hyundai SonataExcellentYes

id: 2007
value: Audi A4GoodSometimes

id: 2009
value: Mitsubishi LancerFairYes

id: 1996
value: Jeep Grand CherokeeFairNo

我想知道如何隔离每个值。这是我的代码:

class ParseCars {
static void main(String[] args) {

    def carsXml = new XmlSlurper().parse("xml/cars.xml")

    carsXml.Cars.Car.each{
        def car = new Car()
        car.year = it.@year.text() as Integer
        car.makeModel = it

        println "id: ${car.year}"
        println "value: ${car.makeModel}"
        println " "
    }
}
}

我似乎无法找到有关处理嵌套值的任何文档,其中父标记也包含这样的值。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

NodeChild.text()将为您提供所有子节点的文本。您可以使用NodeChild.localText()仅检索直接子节点的文本。

所以

car.makeModel = it.localText()

会做你想做的事。

如果您需要单独访问儿童(例如第一个孩子),您可能需要先访问实际的Node。然后,您可以使用children()获取子节点列表并单独访问它们:

it[0].children()[0] // Text node, e.g. Hyundai Sonata
it[0].children()[1] // Condition node, e.g. <Condition id="5">Excellent<Running>Yes</Running></Condition>