gpt4 book ai didi

xml - 是否可以流解析XML父元素而不解析其子元素?

转载 作者:行者123 更新时间:2023-12-01 22:12:41 25 4
gpt4 key购买 nike

给定以下XML:

<Report name="scan_against_stuff">
<ReportHost>
....
</ReportHost>
<ReportHost>
....
</ReportHost>
<ReportHost>
....
</ReportHost>
<ReportHost>
....
</ReportHost>
<ReportHost>
....
</ReportHost>
</Report>
我想在Go中流解析此XML。特别是,我想流解析 <ReportHost>元素,而不是一次将它们全部加载到内存中。问题是我还想检索 name元素的 <Report>属性。为什么这是个问题?好吧,我熟悉的流解析方法将要求我解析整个 <Report>元素,其中包括所有 <ReportHost>元素,因为它们是 <Report>元素的子元素。我有什么办法可以解析父 <Report>元素而不解析子 <ReportHost>元素?
编辑
我正在根据Volker的评论对此进行编辑以澄清。使用以下代码, else if ty.Local.Name == "ReportHost"块永远不会触发,而如果删除了 "ty.Local.Name == "Report"块(并且 else if更改为 if),它将触发。我认为这是因为一旦丢弃 Report元素后,其子元素 ReportHost元素将不再可用于处理。
parsexml.go
type ReportName struct {
Name string `xml:"name,attr"`
}

type ReportHost struct{
....
}

d := xml.NewDecoder(f)
for {
tok, err := d.Token()
if tok == nil || err == io.EOF {
// EOF means we're done.
break
} else if err != nil {
log.Fatalf("Error decoding token: %s", err)
}
//
switch element := tok.(type) {
case xml.StartElement:
if element.Name.Local == "Report" {
if err = d.DecodeElement(&reportName, &element); err != nil {
log.Fatalf("Error decoding item: %s", err)
}
else if element.Name.Local == "ReportHost" {
if err = d.DecodeElement(&reportHost, &element); err != nil {
log.Fatalf("Error decoding item: %s", err)
}
}

最佳答案

解码方法会吞噬元素的所有子元素。要流式传输元素的子级,请直接访问元素的属性,而不要使用解码。

    switch element := tok.(type) {
case xml.StartElement:
if element.Name.Local == "Report" {

// Look for report name in attributes.
for _, attr := range element.Attr {
if attr.Name.Local == "name" {
fmt.Println("name =", attr.Value)
}
}

} else if element.Name.Local == "ReportHost" {
var reportHost ReportHost
if err = d.DecodeElement(&reportHost, &element); err != nil {
log.Fatalf("Error decoding item: %s", err)
}
fmt.Println("host =", reportHost.Data)
}
}
Run it on the playground

关于xml - 是否可以流解析XML父元素而不解析其子元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62557496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com