groovy操作xml,获取属性值和标签值,并将其修改
一、用groovy操作xml,修改xml的值
由于我操作的是plist文件,其中会有IOS的dtd对xml验证,解析的时候会报错,如下:
org.xml.sax.SAXParseException; systemId: file:///Users/guoyf/Desktop/Info.plist; lineNumber: 2; columnNumber: 10; 将功能 "http://apache.org/xml/features/disallow-doctype-decl" 设置为“真”时, 不允许使用 DOCTYPE。
解决方法参考:点击这里吧
话不多说,上代码
import groovy.xml.MarkupBuilder
import groovy.xml.XmlUtil
import groovy.xml.*
import java.io.*
class XmlWriter {
public static main(def args){
/*关闭解析器的验证,不去下载外部dtd文件来对xml进行验证
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
*/
def parser = new XmlParser();
parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl",false);
parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);
def file = new File("oa.plist");
def config = parser.parse(file);//解析xml文件
//获取xml里面属性为version的值,version="1.0"
def version = config.attributes().get("version");//1.0
def dict = config.dict;
config.attributes().put("version","123");//将属性值"1.0"改为"123"
//打印属性为name的值,name="云办公呀呀呀"
println config.attributes().get("name");//云办公呀呀呀
// println "${config.attribute('version')}"
println config.dict.array.dict.array.dict[0].string[1].text();//获取标签值并打印
//修改标签值
config.dict.array.dict.array.dict[0].string[1].value()[0] = "123456"
def xmlFile = "configNewToString.xml";
//用UTF-8写入,默认为GBK,不然会有乱码
PrintWriter pw = new PrintWriter(xmlFile,("UTF-8"));
// PrintWriter pw = new PrintWriter(xmlFile,("GBK"));
pw.write(XmlUtil.serialize(config));//用XmlUtil.serialize方法,将String改为xml格式
pw.close();
}
}
附上我要解析的plist源文件即oa.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0" name="云办公呀呀呀">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://version.geshuinfo.cn:4444/sys/sysAttachment/download?pkid=65d2038e505a432da323f91f409e81ef</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>http://ming.pactera.com/mingwebApp/app/logo.5757.png</string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>md5</key>
<string>baae4e9499e9b29c2420ad8a002f33c2</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>http://ming.pactera.com/mingwebApp/app/logo.512512.jpg</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.chinazw.community</string>
<key>bundle-version</key>
<string>1.1.0</string>
<key>kind</key>
<string>software</string>
<key>subtitle</key>
<string>OA</string>
<key>title</key>
<string>OA</string>
</dict>
</dict>
</array>
</dict>
</plist>
然后是通过PrintWriter写入的configNewToString.xml文件,其实这个你可以用和源文件同名的oa.plst这样就能覆盖源文件达到更新的标准了,我的生成文件如下:
<?xml version="1.0" encoding="UTF-8"?><plist version="123" name="云办公呀呀呀">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>123456</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>http://ming.pactera.com/mingwebApp/app/logo.5757.png</string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>md5</key>
<string>baae4e9499e9b29c2420ad8a002f33c2</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>http://ming.pactera.com/mingwebApp/app/logo.512512.jpg</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.chinazw.community</string>
<key>bundle-version</key>
<string>1.1.0</string>
<key>kind</key>
<string>software</string>
<key>subtitle</key>
<string>OA</string>
<key>title</key>
<string>OA</string>
</dict>
</dict>
</array>
</dict>
</plist>
是不是觉得少了点啥?对的,就是少了
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
这个验证我们解析的时候被关闭了,你可以当做给删除了。是不是很恼火,正常的xml到此就可以结束了,可是IOS的plist需要它来验证,这个时候你就不能用解析xml的方法来改值了,下面我提供一个操作文件的方法来改值
二、操作文件来改值
代码不多,要改的地方按你的需求用正则来写就可以了,代码如下:
//原始文件
def filePath = "oa.plist"
def file = new File(filePath)
//临时文件
def tempFilePath = "oa1.plist"
def tempFile = new File(tempFilePath)
//以"UTF-8"来写入,不然有汉字乱码的问题,默认为GBK
def out = tempFile.newPrintWriter("UTF-8")
def lineNum = 1
def newLine = ""
file.eachLine ("UTF-8"){
if (lineNum>2){
//前两行不做处理,只处理后面的内容
it = it.replace("version=\"1.0\"","version=\"2.0\"")
}
//写入
out.println(it);
lineNum++
}
//完成写入
out.flush()
out.close()
以上就我是用来修改xml值的方法,android小白,有大神话还望指教!!!!!!!!!!