golang 总结之xml

本记录有些简略,对于xml可以先定义结构体(不适合属性不固定,变属性的只有自己解析)


(承运商代码)
1234567
(错误码)
0
(错误提示)
正常
(在途车辆数)
4
(密钥)
QAvgM+9Ot7rN9Pyzp+6/oQ==
(在途车辆车牌号)

YPXXXXX
YPFXXXX
HBXXXX
HBXXXX

/* ok
type RespResultInfo struct {
	//XMLName     xml.Name `xml:"result"`
	CarrierCode string   `xml:"carrierCode"`
	ErrCode     string   `xml:"errCode"`
	ErrContent  string   `xml:"errContent"`
	CarNums     string   `xml:"carNums"`
	Key         string   `xml:"key"`
	QueryCars   []string `xml:"queryCars>queryCar"`
}

type QueryCar struct {
	QueryCar []string `xml:"queryCar"`
	//Value string `xml:",innerxml"`
}
*/

/* ok
type RespResultInfo struct {
	//XMLName     xml.Name `xml:"result"`
	CarrierCode string   `xml:"carrierCode"`
	ErrCode     string   `xml:"errCode"`
	ErrContent  string   `xml:"errContent"`
	CarNums     string   `xml:"carNums"`
	Key         string   `xml:"key"`
	QueryCars   QueryCar `xml:"queryCars"`
}

type QueryCar struct {
	QueryCar []string `xml:"queryCar"`
	//Value string `xml:",innerxml"`
}


*/

//-------------------------------------------
type RespResultInfo struct {
	//XMLName     xml.Name `xml:"result"`
	CarrierCode string   `xml:"carrierCode"`
	ErrCode     string   `xml:"errCode"`
	ErrContent  string   `xml:"errContent"`
	CarNums     string   `xml:"carNums"`
	Key         string   `xml:"key"`
	QueryCars   QueryCar `xml:"queryCars"`
}

type QueryCar struct {
	QueryCar []string `xml:"queryCar"`
	//Value string `xml:",innerxml"`
}

//-------------------------------------------

func main(){
v := new(RespResultInfo)
				err := xml.Unmarshal([]byte(rcvstr), v)
				if err != nil {
					fmt.Printf("error: +%v", err)
					return
				}

				fmt.Printf("%+v\n", v)
}
func XmlDecode(data string) map[string]string {
	printFlag := false
	decoder := xml.NewDecoder(strings.NewReader(data))
	result := make(map[string]string)
	key := ""
	for {
		token, err := decoder.Token() //读取一个标签或者文本内容

		if err == io.EOF {
			if printFlag {
				fmt.Println("parse Finish")
			}
			return result
		}
		if err != nil {
			if printFlag {
				fmt.Println("parse Fail:", err)
			}

			return result
		}
		switch tp := token.(type) { //读取的TOKEN可以是以下三种类型:StartElement起始标签,EndElement结束标签,CharData文本内容
		case xml.StartElement:

			se := xml.StartElement(tp) //强制类型转换

			if se.Name.Local != "xml" {
				key = se.Name.Local
				fmt.Println(key)
			}
			if len(se.Attr) != 0 { //读取标签属性
				if printFlag {
					fmt.Println("Attrs:", se.Attr)
				}
			}

			if printFlag {
				fmt.Println("SE.NAME.SPACE:", se.Name.Space) //读取命名空间
				fmt.Println("SE.NAME.LOCAL:", se.Name.Local) //读取标签名称
				fmt.Println()
			}
		case xml.EndElement:
			ee := xml.EndElement(tp)
			if ee.Name.Local == "xml" {
				return result
			}
			if printFlag {
				fmt.Println("EE.NAME.SPACE:", ee.Name.Space)
				fmt.Println("EE.NAME.LOCAL:", ee.Name.Local)
			}
		case xml.CharData: //文本数据,注意一个结束标签和另一个起始标签之间可能有空格
			cd := xml.CharData(tp)
			data := strings.TrimSpace(string(cd))
			if len(data) != 0 {
				result[key] = data
				if printFlag {
					fmt.Println(key, ",", data)
				}
			}
		}
	}
}

 

 

 

你可能感兴趣的:(golang)