我不知道XML文件中存在的标记。我想知道某个标签是否存在。例如,假设文件是这样的:
<?xml version='1.1' encoding='UTF-8'?>
<tag1>
<tag2></tag2>
</tag1>
<tag3/>
在这里,我想检查tag2
是否存在。使用go
解析XML文件的唯一方法是定义structs
,但为此,我将不得不知道文件中存在哪些标记,我不知道。
您可以使用事件驱动的XML解析。使用xml.Decoder
创建xml.NewDecoder()
,并通过重复调用Decoder.Token()
来解析XML的内容(在循环中)。
您可以使用type assertion检查令牌是否为start元素,检查xml.StartElement
类型。如果断言成功,您可以检查元素的名称是否与您要查找的元素匹配。
这是它的样子:
func checkTag(src, tag string) (bool, error) {
decoder := xml.NewDecoder(strings.NewReader(src))
for {
t, err := decoder.Token()
if err != nil {
if err == io.EOF {
return false, nil
}
return false, err
}
if se, ok := t.(xml.StartElement); ok {
if se.Name.Local == tag {
return true, nil
}
}
}
}
测试它:
func main() {
fmt.Println(checkTag(src, "tag2"))
fmt.Println(checkTag(src, "tagX"))
}
const src = `<?xml version='1.0' encoding='UTF-8'?>
<tag1>
<tag2></tag2>
</tag1>
<tag3/>`
输出(在Go Playground上试试):
true <nil>
false <nil>
正如您所看到的,tag2
在源XML中被正确找到,并且找不到tagX
。
见相关问题:Unmarshalling heterogeneous list of XML elements in Go
一种方法是使用XPath和xmlpath包:
xml := `<?xml version='1.0' encoding='UTF-8'?><tag1><tag2>foo</tag2></tag1><tag3/>`
path := "/tag1/tag2"
compiledPath := xmlpath.MustCompile("/tag1/tag2")
root, err := xmlpath.Parse(strings.NewReader(xml))
if err != nil {
log.Fatal(err)
}
if value, ok := compiledPath.String(root); ok {
fmt.Printf("Found tag at path %v. Value: %v\n", path, value)
} else {
fmt.Printf("Tag at path %v not found\n", path)
}