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

问题描述 投票:1回答:2

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

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

在这里,我想检查tag2是否存在。使用go解析XML文件的唯一方法是定义structs,但为此,我将不得不知道文件中存在哪些标记,我不知道。

xml go
2个回答
1
投票

您可以使用事件驱动的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


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)
}
© www.soinside.com 2019 - 2024. All rights reserved.