如何使用go检查XML文件中是否存在标签?

时间:2018-08-02 08:27:29

标签: xml go

我不知道XML文件中存在的标签。我想知道是否存在某个标签。 例如,假设文件是​​这样的:

<?xml version='1.1' encoding='UTF-8'?>
<tag1>
    <tag2></tag2>
</tag1>
<tag3/>

在这里,我想检查tag2是否存在。使用go解析XML文件的唯一方法是定义structs,但为此,我必须知道文件中存在哪些标签,而我没有。

2 个答案:

答案 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)
}