Golang中如何校验XML数据的必填标签是否缺失
检测XML必填标签是否存在的Golang修正方案
需求说明
需要检测XML数据中<person>节点的必填标签name和age是否存在,判断标准是标签本身是否缺失,而非标签值是否为空。示例XML数据如下:
<people> <person> <id>1</id> <name>John Doe</name> <age>30</age> </person> <person> <id>2</id> <age></age> </person> <person> <id>3</id> <name></name> </person> <person> <id>4</id> <address>Chandigarh</address> </person> </people>
正确判定结果应为:
- ID为2的节点缺失
name标签 - ID为3的节点缺失
age标签 - ID为4的节点缺失
name和age标签
预期输出:
name tag missing for id: [2 4] age tag missing for id: [3 4]
原代码问题
原代码通过判断字段值是否为空字符串来判定标签缺失,无法区分“标签不存在”和“标签存在但值为空”的情况,同时错误检测了非必填的address标签,导致输出结果不符合预期:
age is missing for id: 2 3 4 , address is missing for id: 1 2 3 , name is missing for id: 2 3 4
修正后的代码
核心修改是将Person结构体中的Name和Age字段改为指针类型,利用指针nil值来精准判断标签是否存在:
package main import ( "encoding/xml" "fmt" "log" ) type Person struct { ID int `xml:"id"` Name *string `xml:"name"` // 指针类型,标签不存在时为nil Age *string `xml:"age"` // 指针类型,标签不存在时为nil } func main() { xmlData := ` <people> <person> <id>1</id> <name>John Doe</name> <age>30</age> </person> <person> <id>2</id> <age></age> </person> <person> <id>3</id> <name></name> </person> <person> <id>4</id> <address>Chandigarh</address> </person> </people> ` var people struct { Persons []Person `xml:"person"` } err := xml.Unmarshal([]byte(xmlData), &people) if err != nil { log.Fatal(err) } missingTags := make(map[string][]int) for _, person := range people.Persons { // 检测name标签是否存在(指针为nil表示标签缺失) if person.Name == nil { missingTags["name"] = append(missingTags["name"], person.ID) } // 检测age标签是否存在(指针为nil表示标签缺失) if person.Age == nil { missingTags["age"] = append(missingTags["age"], person.ID) } } // 按要求格式输出结果 for tagName, ids := range missingTags { fmt.Printf("%s tag missing for id: %v\n", tagName, ids) } }
代码说明
- 指针类型区分存在性:将
Name和Age定义为*string类型,当XML中对应标签不存在时,指针值为nil;标签存在(无论值是否为空)时,指针会指向对应字符串值(空字符串也会被初始化,指针非nil)。 - 聚焦必填标签:仅检测需求中指定的
name和age标签,不再处理非必填的address。 - 结果输出:收集缺失标签对应的ID,按照清晰的格式输出判定结果。
内容的提问来源于stack exchange,提问作者Harshit Saini
相关产品推荐
相关产品推荐

