我不知道XML文件中存在的标签。我想知道是否存在某个标签。 例如,假设文件是这样的:
<?xml version='1.1' encoding='UTF-8'?>
<tag1>
<tag2></tag2>
</tag1>
<tag3/>
在这里,我想检查tag2
是否存在。使用go
解析XML文件的唯一方法是定义structs
,但为此,我必须知道文件中存在哪些标签,而我没有。
答案 0 :(得分:1)
您可以使用事件驱动的 XML解析。使用xml.Decoder
创建一个xml.NewDecoder()
,并通过重复(循环)调用Decoder.Token()
来解析XML的内容。
您可以使用type assertion并检查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>
如您所见,在源XML中正确找到了tag2
,而在源XML中找不到了tagX
。
查看相关问题:Unmarshalling heterogeneous list of XML elements in Go
答案 1 :(得分:0)
一种方法是使用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)
}