golang解析生成xml字符

golang xml处理函数目前常规的应用没有问题,主要利用xml.Marshal和xml.Unmarshal。
不能生成自关闭标签,能解析自关闭标签。遇到命名空间的时候比较头大,解析和生成xml不能用一个结构,必须定义成2个。

1:获取字段属性

func main() {
    d := `<result code="1000"><msg>Command completed successfully.</msg></result>`
    type result struct {
        Code     int    `xml:"code,attr"`
        Msg      string `xml:"msg"`
    }
    abc := result{}
    xml.Unmarshal([]byte(d),&amp;abc)
    fmt.Printf("%+v\n",abc)
}
    //{Code:1000 Msg:Command completed successfully.}

2:节点带有属性和内容的获取方式

func main() {
    d := `<result code="1000"><period unit="y">1</period></result>`
    type result struct {
        Period struct{
            Unit string `xml:"unit,attr"`
            Value int `xml:",chardata"`
        } `xml:"period"`
    }
    abc := result{}
    xml.Unmarshal([]byte(d),&amp;abc)
    fmt.Printf("%+v\n",abc)
}
    //{Period:{Unit:y Value:1}}

3:如果有节点一样,仅仅是命名空间不一样的处理方式

    InfData Info `xml:"urn:ietf:params:xml:ns:rgp-1.0 infData"`
    Verify Verify `xml:"urn:ietf:params:xml:ns:verificationCode-1.0 infData"`

golang命名空间处理目前不支持前缀的处理方式,另一种处理方式就是把infData申明成数组

4:生成xml时忽略一些字段 json也适用
把字段的类型定义为引用或者interface{}

    Data *VerifyData `xml:"data,omitempty"`
    Data interface{} `xml:"data,omitempty"`
    //这2种方式都可以,第一种方便阅读代码

5:解析自定义字段,类似时间字段

//定义
type EppTime struct {
	time.Time
}

func (c *EppTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
	var v string
	d.DecodeElement(&amp;v, &amp;start)
	parse, err := time.Parse("2006-01-02T15:04:05Z", v)
	*c = EppTime{parse}
	return err
}
//使用
type XmlStruct{
    Abc EppTime `xml:"abc"`
}

6:生成CDATA字段,有特殊字符的字段

type DomainPwd struct {
	PW struct {
		Value string `xml:",cdata"`
	} `xml:"pw"`
}

7:生成带命名空间的字段

type Renew struct{
    Name string `xml:"domain:name"`
ExpDate  string `xml:"domain:expDate"`
}

在开发过程中,如果解析和生成都没有报错,结果又不对,注意看字段是否是小写,只有大写的才可以。
不能生成自关闭标签,得到的结果是这样的

<domain:status s="ok" ></domain:status>

看golang官方讨论有人反馈,不过目前没有处理。

xml原始处理方式:https://www.ciphp.com/2018/08/1170

发表评论

电子邮件地址不会被公开。 必填项已用*标注