Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
Java 递归地启用子节点XMLGroovy_Java_Xml_Groovy_Xml Parsing - Fatal编程技术网

Java 递归地启用子节点XMLGroovy

Java 递归地启用子节点XMLGroovy,java,xml,groovy,xml-parsing,Java,Xml,Groovy,Xml Parsing,我有以下xml文件: <testItems> <children> <testItem name=TestSuite1 enabled=false> <children> <testItem name=test1 enabled=false> </testItem> <testItem name=test2 enabled=false> &l

我有以下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>
但我有以下例外:

 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="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>
    
    打印出:

    <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>
    
    
    
    无法按预期工作,这只是启用/禁用所有测试项。我希望,当给定一个测试项名称时,我启用它及其所有子项,例如parameterGiven=TestSuite1=>TestSuite1,test1,test2,test3是真的,而所有其他的都是假的。我已经修复了解决方案,以更好地匹配这个问题。您认为我可以修改您的代码,以同时启用套件的父项吗?例如,如果suiteToEnable=test2,我希望test2为真,TestSuite1(其父级)也为真。@GeorgeCimpoies我已经添加了第二个代码段,根据您的上一条评论,该代码段会进行选择性的子级祖父母修改。我知道我越界了,我无法表达我多么感谢您的帮助,但是你认为你可以修改最后一个片段来为无限多的父母工作吗?假设test2有一个子testX和suiteToEnable='testX'=>testX,test2和TestSuite1变为3。但是,如果suiteEnable='test1',则只有test1和TestSuite1变为true。我将在问题中添加另一个xml片段。再次感谢你的帮助!
    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>
    
    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>