gpt4 book ai didi

java - 递归启用子节点 xml groovy

转载 作者:行者123 更新时间:2023-12-02 11:13:26 25 4
gpt4 key购买 nike

我有以下 xml 文件:

<testItems>
<children>
<testItem name=TestSuite1 enabled=false>
<children>
<testItem name=test1 enabled=false>
</testItem>
<testItem name=test2 enabled=false>
</testItem>
<testItem name=test3 enabled=false>
</testItem>
</children>
</testItem>
<testItem name=TestSuite2 enabled=false>
<children>
<testItem name=test3 enabled=false>
</testItem>
<testItem name=test4 enabled=false>
</testItem>
<testItem name=test5 enabled=false>
</testItem>
</children>
</testItem>

结构可以改变(意味着树的深度可以改变)。

我想启用 TestSuite1 并递归地启用 TestSuite1 的所有子项(test1、test2、test3)

到目前为止我已经:

def root = new XmlParser(false, false, true).parse(mdsFile)

root.depthFirst().each {
if (it.@name == testItemToEnable) {
it.@enabled = true
it.children.depthFirst().each { child ->
child.@enabled = true
}
}

但我有以下异常(exception):

 No signature of method: groovy.util.NodeList.depthFirst() is applicable for argument types: () values: []

[在评论中的问题后添加]

<testItems>
<children>
<testItem name="TestSuite1" enabled="false">
<children>
<testItem name="test1" enabled="false">
</testItem>
<testItem name="test2" enabled="false">
<children>
<testItem name="testX" enabled="false">
</testItem>
</children>
</testItem>
<testItem name="test3" enabled="false">
</testItem>
</children>
</testItem>
<testItem name="TestSuite2" enabled="false">
<children>
<testItem name="test3" enabled="false">
</testItem>
<testItem name="test4" enabled="false">
</testItem>
<testItem name="test5" enabled="false">
</testItem>
</children>
</testItem>

场景:1. suiteToEnable='test1' => test1,TestSuite1变为true

  • suiteToEnable='testX' => testX、test2 和 TestSuite1 变为 true
  • 最佳答案

    [澄清评论后修改]

    以下代码将启用的属性设置为 true 并打印出结果字符串:

    import groovy.xml.*

    def str = '''\
    <testItems>
    <children>
    <testItem name="TestSuite1" enabled="false">
    <children>
    <testItem name="test1" enabled="false">
    </testItem>
    <testItem name="test2" enabled="false">
    </testItem>
    <testItem name="test3" enabled="false">
    </testItem>
    </children>
    </testItem>
    <testItem name="TestSuite2" enabled="false">
    <children>
    <testItem name="test3" enabled="false">
    </testItem>
    <testItem name="test4" enabled="false">
    </testItem>
    <testItem name="test5" enabled="false">
    </testItem>
    </children>
    </testItem>
    </children>
    </testItems>'''

    def xml = new XmlSlurper().parseText(str)

    def suiteToEnable = 'TestSuite2'

    xml.'**'.find {
    it.name() == 'testItem' && it.@name == suiteToEnable
    }.'**'.findAll {
    it.name() == 'testItem'
    }*.@enabled = 'true'

    println XmlUtil.serialize(xml)

    输出:

    <?xml version="1.0" encoding="UTF-8"?><testItems>
    <children>
    <testItem name="TestSuite1" enabled="false">
    <children>
    <testItem name="test1" enabled="false"/>
    <testItem name="test2" enabled="false"/>
    <testItem name="test3" enabled="false"/>
    </children>
    </testItem>
    <testItem name="TestSuite2" enabled="true">
    <children>
    <testItem name="test3" enabled="true"/>
    <testItem name="test4" enabled="true"/>
    <testItem name="test5" enabled="true"/>
    </children>
    </testItem>
    </children>
    </testItems>

    这使用了常规 depthFirst alias ** ,以及 spread operator *. .

    [评论中问题后的附录]

    对于仅启用一个 child 及其祖 parent 的第二个问题,我们可以这样做:

    def xml = new XmlSlurper().parseText(str)

    def suiteToEnable = 'test2'

    def item = xml.'**'.find {
    it.name() == 'testItem' && it.@name == suiteToEnable
    }
    item.@enabled = 'true'
    item.parent().parent().@enabled = 'true'

    println XmlUtil.serialize(xml)

    打印:

    <?xml version="1.0" encoding="UTF-8"?><testItems>
    <children>
    <testItem name="TestSuite1" enabled="true">
    <children>
    <testItem name="test1" enabled="false"/>
    <testItem name="test2" enabled="true"/>
    <testItem name="test3" enabled="false"/>
    </children>
    </testItem>
    <testItem name="TestSuite2" enabled="false">
    <children>
    <testItem name="test3" enabled="false"/>
    <testItem name="test4" enabled="false"/>
    <testItem name="test5" enabled="false"/>
    </children>
    </testItem>
    </children>
    </testItems>

    [评论中另一个问题后的附录2]

    以下代码首先查找特定节点,然后将元素名为 testItem 的所有父节点设置为 enabled="true":

    def xml = new XmlSlurper().parseText(str)
    def suiteToEnable = 'testX'

    // first find our target node
    def item = xml.'**'.find {
    it.name() == 'testItem' && it.@name == suiteToEnable
    }

    // then get the parents recursively, find all parents called
    // 'testItem' and set them to enabled = 'true'
    getParents(item).findAll { it.name() == 'testItem' }.each {
    it.@enabled = 'true'
    }

    println XmlUtil.serialize(xml)

    // recursively get parents of node using the '..' alias for
    // the node.parent() call
    def getParents(node) {
    (node.is(node.'..') ? [] : getParents(node.'..')) + [node]
    }

    打印出:

    <testItems>
    <children>
    <testItem name="TestSuite1" enabled="true">
    <children>
    <testItem name="test1" enabled="false"/>
    <testItem name="test2" enabled="true">
    <children>
    <testItem name="testX" enabled="true"/>
    </children>
    </testItem>
    <testItem name="test3" enabled="false"/>
    </children>
    </testItem>
    <testItem name="TestSuite2" enabled="false">
    <children>
    <testItem name="test3" enabled="false"/>
    <testItem name="test4" enabled="false"/>
    <testItem name="test5" enabled="false"/>
    </children>
    </testItem>
    </children>
    </testItems>

    关于java - 递归启用子节点 xml groovy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50448632/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com