Атрибут "x", связанный с пространством имен "xx", уже указан для элемента "xxx" - PullRequest
1 голос
/ 11 марта 2020

У меня есть некоторый фрагмент кода теста:

import groovy.xml.XmlUtil
import groovy.xml.StreamingMarkupBuilder
class Greet {
def name
Greet(who) { name = who[0].toUpperCase() +
     who[1..-1] }
def salute() { 
     println "Hello !" 
     def input = """
        <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <application xmlns:android="http://schemas.android.com/apk/res/android"
            android:txt="this is origin">
            <activity android:name="me.aolphn.MainActivity"/>
            <activity xmlns:android="http://schemas.android.com/apk/res/android" android:configChanges ="me.aolphn.SecondActivity"/>

        </application>
        </manifest>
        """
    def root = new XmlParser(false, true).parseText(input)
    //def root = new XmlSlurper(false, true).parseText(input).declareNamespace(android:"http://schemas.android.com/apk/res/android")
    //def writer = new StringWriter()
    //root.'application'.attributes().put('@android:txt1','t1')
    root.'application'[0].'activity'.each{act->
      act.attributes()['android:configChanges']='txt aa'
    }

    println("========xxxxx:\n"+
    XmlUtil.serialize(root))
    //print writer.toString()
}
}

g = new Greet('world')  // create object
g.salute()

Если я запустил его в режиме онлайн в здесь , в приведенном выше коде возникнет некоторое исключение, сообщение об ошибке, как показано ниже:

groovy.lang.GroovyRuntimeException: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 96; Attribute "configChanges" bound to namespace "http://schemas.android.com/apk/res/android" was already specified for element "activity".
    at Greet.salute(Script1.groovy:29)
    at Greet$salute.call(Unknown Source)
    at Script1.run(Script1.groovy:35)

Как исправить это исключение? Пожалуйста, помогите мне. Любой вклад будет оценен.

1 Ответ

0 голосов
/ 11 марта 2020

Через несколько часов я исправил это сам, вот правильный способ сделать то, что мне нужно.

import groovy.xml.XmlUtil 
import groovy.xml.StreamingMarkupBuilder 
class Greet { 
def name 
Greet(who) { 
name = who[0].toUpperCase() +      who[1..-1] 
} 
def hello() {     
    println "Hello !"       
    def input = """         
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <application xmlns:android="http://schemas.android.com/apk/res/android" 
            android:txt="this is origin">  
            <activity android:name="me.aolphn.MainActivity"/> 
            <activity xmlns:android="http://schemas.android.com/apk/res/android" 
                android:name ="me.aolphn.SecondActivity"
                android:configChanges="origin config xxx"/>
        </application>
    </manifest> 
    """  
    def parser = new XmlSlurper(false,true)
    def root = parser.parseText(input) 
    root.'application'[0].'activity'.each{act-> 

        String value = act.@'android:configChanges'
        println("check value:$value")
        if(value == null||value.isEmpty()){
            act.@'androidconfigChanges'='txt is empty ' 
        }else{
            println("check is invoke ====")
            act.attributes().put('android:configChanges','txt is not null' )
        }
    }
    def xml = XmlUtil.serialize(root)
    root = parser.parseText(xml.replaceAll("androidconfigChanges", "android:configChanges"))
    println("========xxxxx:\n"+     XmlUtil.serialize(root)) 
}  
}
g = new Greet('world')  
g.hello()
​​​​​​​​​​​​​​​​​​​​​​​​​​​

Результат на рисунке:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...