zoukankan      html  css  js  c++  java
  • golang学习笔记---xml 读取

    对应 default.xml文件
    <?xml version="1.0" encoding="UTF-8"?>
    <config>
      <smtpServer>smtp.163.com</smtpServer>
      <smtpPort>25</smtpPort>
      <sender>user@163.com</sender>
      <senderPasswd>123456</senderPasswd>
      <receivers flag="true">
        <user>Mike_Zhang@live.com</user>
        <user>test1@qq.com</user>
      </receivers>
    </config>  
      


    范例1:golang代码:
    package main
    
    import (
    	"encoding/xml"
    	"fmt"
    	"io/ioutil"
    	"os"
    )
    
    type SConfig struct {
    	XMLName      xml.Name   `xml:"config"`     // 指定最外层的标签为config
    	SmtpServer   string     `xml:"smtpServer"` // 读取smtpServer配置项,并将结果保存到SmtpServer变量中
    	SmtpPort     int        `xml:"smtpPort"`
    	Sender       string     `xml:"sender"`
    	SenderPasswd string     `xml:"senderPasswd"`
    	Receivers    SReceivers `xml:"receivers"` // 读取receivers标签下的内容,以结构方式获取
    }
    
    type SReceivers struct {
    	Flag string   `xml:"flag,attr"` // 读取flag属性
    	User []string `xml:"user"`      // 读取user数组
    }
    
    func main() {
    	file, err := os.Open("default.xml") // For read access.
    	if err != nil {
    		fmt.Printf("error: %v", err)
    		return
    	}
    	defer file.Close()
    	data, err := ioutil.ReadAll(file)
    	if err != nil {
    		fmt.Printf("error: %v", err)
    		return
    	}
    	v := SConfig{}
    	err = xml.Unmarshal(data, &v)
    	if err != nil {
    		fmt.Printf("error: %v", err)
    		return
    	}
    
    	fmt.Println(v)
    	fmt.Println("SmtpServer : ", v.SmtpServer)
    	fmt.Println("SmtpPort : ", v.SmtpPort)
    	fmt.Println("Sender : ", v.Sender)
    	fmt.Println("SenderPasswd : ", v.SenderPasswd)
    	fmt.Println("Receivers.Flag : ", v.Receivers.Flag)
    	for i, element := range v.Receivers.User {
    		fmt.Println(i, element)
    	}
    } 
    输出:

    {{ config} smtp.163.com 25 user@163.com 123456 {true [Mike_Zhang@live.com test1@qq.com]}}

    SmtpServer : smtp.163.com

    SmtpPort : 25

    Sender : user@163.com

    SenderPasswd : 123456

    Receivers.Flag : true

    0 Mike_Zhang@live.com

    1 test1@qq.com

    范例2:

    要读取的XML如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
    	<string name="VideoLoading">Loading video…</string>
    	<string name="ApplicationName">what</string>
    </resources>
    

    这种结构的XML,其末节点是属性与文本并存的

    根据这个XML,生成对应的struct 

    type StringResources struct {
    	XMLName        xml.Name         `xml:"resources"`
    	ResourceString []ResourceString `xml:"string"`
    }
    
    type ResourceString struct {
    	XMLName    xml.Name `xml:"string"`
    	StringName string   `xml:"name,attr"`
    	InnerText  string   `xml:",innerxml"`
    }
    

    内部属性都要大写字母开头,属性节点的名称变量名固定为XMLName,内部的文本统一叫innerxml)  

    以下为完整读取此XML的代码

    package main
    
    import (
    	"encoding/xml"
    	"io/ioutil"
    	"log"
    )
    
    type StringResources struct {
    	XMLName        xml.Name         `xml:"resources"`
    	ResourceString []ResourceString `xml:"string"`
    }
    
    type ResourceString struct {
    	XMLName    xml.Name `xml:"string"`
    	StringName string   `xml:"name,attr"`
    	InnerText  string   `xml:",innerxml"`
    }
    
    func main() {
    	content, err := ioutil.ReadFile("studygolang.xml")
    	if err != nil {
    		log.Fatal(err)
    	}
    	var result StringResources
    	err = xml.Unmarshal(content, &result)
    	if err != nil {
    		log.Fatal(err)
    	}
    	log.Println(result)
    	log.Println(result.ResourceString)
    	for _, o := range result.ResourceString {
    		log.Println(o.StringName + "===" + o.InnerText)
    	}
    
    }
    

      输出结果:

    2021/10/09 09:08:58 {{ resources} [{{ string} VideoLoading Loading video…} {{ string} ApplicationName what}]}
    2021/10/09 09:08:59 [{{ string} VideoLoading Loading video…} {{ string} ApplicationName what}]
    2021/10/09 09:08:59 VideoLoading===Loading video…
    2021/10/09 09:08:59 ApplicationName===what
    

      

    接下来对这个XMl中的属性值为ApplicationName的文本内容进行修改,然后保存到文件里,代码如下:

    package main
    
    import (
    	"encoding/xml"
    	"fmt"
    	"io/ioutil"
    	"log"
    	"os"
    	"strings"
    )
    
    type StringResources struct {
    	XMLName        xml.Name         `xml:"resources"`
    	ResourceString []ResourceString `xml:"string"`
    }
    
    type ResourceString struct {
    	XMLName    xml.Name `xml:"string"`
    	StringName string   `xml:"name,attr"`
    	InnerText  string   `xml:",innerxml"`
    }
    
    func main() {
    	content, err := ioutil.ReadFile("studygolang.xml")
    	if err != nil {
    		log.Fatal(err)
    	}
    	var result StringResources
    	err = xml.Unmarshal(content, &result)
    	if err != nil {
    		log.Fatal(err)
    	}
    	log.Println(result)
    	log.Println(result.ResourceString)
    	for i, line := range result.ResourceString {
    		log.Println(line.StringName + "===" + line.InnerText)
    
    		//修改ApplicationName节点的内部文本innerText
    		if strings.EqualFold(line.StringName, "ApplicationName") {
    			fmt.Println("change innerText")
    
    			//注意修改的不是line对象,而是直接使用result中的真实对象
    			result.ResourceString[i].InnerText = "这是新的ApplicationName"
    		}
    	}
    
    	//保存修改后的内容
    	xmlOutPut, outPutErr := xml.MarshalIndent(result, "", "")
    	if outPutErr == nil {
    		//加入XML头
    		headerBytes := []byte(xml.Header)
    		//拼接XML头和实际XML内容
    		xmlOutPutData := append(headerBytes, xmlOutPut...)
    		//写入文件
    		ioutil.WriteFile("studygolang_test.xml", xmlOutPutData, os.ModeAppend)
    
    		fmt.Println("OK~")
    	} else {
    		fmt.Println(outPutErr)
    	}
    
    }

    生成的XML如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
    	<string name="VideoLoading">Loading video…</string>
    	<string name="ApplicationName">这是新的ApplicationName</string>
    </resources>
    

      

     

     

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    javascript中new Date()的浏览器兼容性问题
    js 时间格式化
    HTML5 JS实现搜索匹配功能
    PHP中preg_match正则匹配的/u /i /s是什么意思
    微信开放接口获取用户昵称保存到MySQL中为空白
    linux下源码安装软件
    格式化MYSQL时间戳函数FROM_UNIXTIME
    Zabbix-proxy安装部署
    使用ss命令对tcp连接数和状态的监控性能优化
    Zabbix使用netstat监控会话
  • 原文地址:https://www.cnblogs.com/saryli/p/15383939.html
Copyright © 2011-2022 走看看