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

3
我不知道XML文件中存在哪些标签,我想知道某个特定的标签是否存在。 例如,假设文件像这样:
<?xml version='1.1' encoding='UTF-8'?>
<tag1>
    <tag2></tag2>
</tag1>
<tag3/>

我想检查是否存在。在Go语言中解析XML文件的唯一方法是定义结构体,但为此,我需要知道文件中存在哪些标签,而我并不知道。
2个回答

1
你可以使用事件驱动的XML解析。使用xml.Decoder创建一个解码器,然后通过重复调用Decoder.Token()(在循环中)来解析XML内容。
你可以使用类型断言检查标记是否为开始元素,并检查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则没有被找到。
查看相关问题:在Go中解组异构的XML元素列表

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

这需要您知道<tag2>有一个父标签<tag1>(即“根”),而提问者不确定我是否正确理解。 - icza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接