Как добавить атрибут, который содержит двоеточие (:) для элемента xml, а затем сериализовать его в groovy? - PullRequest
0 голосов
/ 11 марта 2020

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


​import groovy.xml.XmlUtil
class Greet {

Greet() {  }
def salute() { 
     println "Hello !" 
     def input = """
        <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <application >
            <activity android:name="me.aolphn.MainActivity">
            </activity>
        </application>
        </manifest>
        """
//    def root = new XmlParser(false, true).parseText(input)
    def root = new XmlSlurper(false, true).parseText(input)

    root.'application'.@'android:txt'='this is txt'
    XmlUtil.serialize(root)
}
}

g = new Greet()  // create object
g.salute()
​

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

groovy.lang.GroovyRuntimeException: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 24; Element type "application" must be followed by either attribute specifications, ">" or "/>".
    at Greet.salute(Script1.groovy:24)
    at Greet$salute.call(Unknown Source)
    at Script1.run(Script1.groovy:29)
  • В: Что мне нужно?
  • A: Я хочу добавить атрибут, который содержит пространство имен для элемента xml. Как мой пример, я хочу и атрибут 'android : xxx 'для элемента' application ', XmlUtil.serialize () столкнется с ошибкой после добавления этого. Пожалуйста, помогите мне. Любая ответственность будет оценена.

1 Ответ

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

Наконец, я решаю эту проблему с помощью XmlParser вместо 'XmlSlurper'. Следующий путь верный.


​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="com.cloud.chsocialtest.MainActivity">
            </activity>
        </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].attributes()['android:new']='txt aa'

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

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