groovy操作xml,获取属性值和标签值并修改

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小白,有大神话还望指教!!!!!!!!!!

猜你喜欢

转载自blog.csdn.net/LjingDong/article/details/86289243
今日推荐