Go语言如何反序列化未知结构XML并插入指定标签
处理未知结构XML并插入标签的Go实现方案
方案一:直接字符串替换(简单高效)
如果你的XML格式规整,</container>标签格式固定(无内部多余空白),直接用正则匹配替换就能快速完成需求,无需完整解析XML结构。
package main import ( "fmt" "regexp" "strings" ) func main() { randomOcrXmlString := ` <container> <x></x> <y><z></z></y> <abc></abc> </container>` // 要插入的标签内容 newTag := "<new-tag>inserted content</new-tag>" // 匹配</container>及前面的任意空白字符,确保插入位置正确 re := regexp.MustCompile(`\s*</container>`) result := re.ReplaceAllString(randomOcrXmlString, fmt.Sprintf("\n%s\n</container>", newTag)) fmt.Println(result) }
方案二:XML Token流解析(严谨可靠)
如果XML结构复杂(含命名空间、标签嵌套或格式不固定),用标准库encoding/xml的Token遍历方式更严谨,能精准定位根container的闭合标签位置插入内容。
package main import ( "encoding/xml" "fmt" "strings" ) func main() { randomOcrXmlString := ` <container> <x></x> <y><z></z></y> <abc></abc> </container>` // 构造要插入的新标签元素 newStart := xml.StartElement{Name: xml.Name{Local: "new-tag"}} newEnd := xml.EndElement{Name: xml.Name{Local: "new-tag"}} newText := xml.CharData("inserted content") decoder := xml.NewDecoder(strings.NewReader(randomOcrXmlString)) var tokens []xml.Token var foundContainerEnd bool for { token, err := decoder.Token() if err != nil { break } // 检测到container闭合标签时,先插入新标签内容 if endElem, ok := token.(xml.EndElement); ok && endElem.Name.Local == "container" { tokens = append(tokens, newStart, newText, newEnd) foundContainerEnd = true } tokens = append(tokens, token) if foundContainerEnd { break // 找到根container闭合后提前退出,提升效率 } } // 将Token序列化为XML字符串 var result strings.Builder encoder := xml.NewEncoder(&result) encoder.Indent("", " ") // 保持原XML的缩进格式(可选) for _, t := range tokens { if err := encoder.EncodeToken(t); err != nil { fmt.Println("编码错误:", err) return } } encoder.Flush() fmt.Println(result.String()) }
内容的提问来源于stack exchange,提问作者sexy_pikachu
相关产品推荐
相关产品推荐

