英文:
Golang Xml Unmarshal, No value
问题
类型VastHtml结构体定义了一个VAST广告的HTML表示形式。它包含了广告的各种属性和元素,如版本号、广告ID、广告系统、广告标题、描述等等。其中,Creatives字段表示广告的创意部分,包含了多个创意对象,每个创意对象又包含了序列号、创意ID、线性创意、伴随创意等等。线性创意包含了持续时间、跟踪事件、视频点击等信息,伴随创意包含了宽度、高度、静态资源、跟踪事件、伴随点击等信息。此外,还有其他字段如错误信息、展示链接、媒体文件等。
在main函数中,首先通过http.Get方法获取了一个URL返回的HTTP响应。然后使用ioutil.ReadAll方法读取了响应的内容,并将其存储在xmlDataFromHttp变量中。接下来,使用xml.Unmarshal方法将xmlDataFromHttp解析为VastHtml类型的结构体,并将解析结果存储在xmlData变量中。最后,打印了xmlData.VAST的值。
你好,
在对从URL获取的XmlVast进行解组后,我得到的只是结构体,没有任何值。即使我将XmlVast的内容复制到文件中,然后尝试对其进行解组,结果也是相同的,只有结构体而没有任何值。
提前感谢你的帮助。
英文:
type VastHtml struct {
VAST struct {
Version string `xml:"version,attr"`
Ad struct {
Id string `xml:"id,attr"`
InLine struct {
AdSystem string `xml:"AdSystem"`
AdTitle string `xml:"AdTitle"`
Description string `xml:"Description"`
Error string `xml:"Error"`
Impression []string `xml:"Impression"`
Creatives struct {
Creative []struct {
Sequence string `xml:"sequence,attr"`
Id string `xml:"id,attr"`
Linear struct {
Duration string `xml:"Duration"`
TrackingEvents struct {
Tracking []string `xml:"Tracking"`
} `xml:"TrackingEvents"`
VideoClicks struct {
ClickThrough string `xml:"ClickThrough"`
CustomClick []string `xml:"CustomClick"`
} `xml:"VideoClicks"`
MediaFiles struct {
MediaFile []struct {
Delivery string `xml:"delivery,attr"`
Bitrate string `xml:"bitrate,attr"`
Width string `xml:"width,attr"`
Height string `xml:"height,attr"`
Type string `xml:"type,attr"`
} `xml:"MediaFile"`
} `xml:"MediaFiles"`
} `xml:"Linear"`
CompanionAds struct {
Companion []struct {
Width string `xml:"width,attr"`
Height string `xml:"height,attr"`
StaticResource string `xml:"StaticResource"`
TrackingEvents string `xml:"TrackingEvents"`
CompanionClickThrough string `xml:"CompanionClickThrough"`
} `xml:"Companion"`
} `xml:"CompanionAds"`
} `xml:"Creative"`
} `xml:"Creatives"`
Extensions string `xml:"Extensions"`
} `xml:"InLine"`
} `xml:"Ad"`
} `xml:"VAST"`
}
func main()
{
resp, err := http.Get("http://ad3.liverail.com/?LR_PUBLISHER_ID=1331&LR_CAMPAIGN_ID=229&LR_SCHEMA=vast2")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer resp.Body.Close()
xmlDataFromHttp, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(os.Stdout, string(xmlDataFromHttp))
// read xml http response
var xmlData VastHtml
err = xml.Unmarshal(xmlDataFromHttp, &xmlData)
if err != nil {
panic(err)
}
fmt.Printf("XML===>: ", xmlData.VAST)
}
Hello everone,
after Unmarshaling the XmlVast that I get from an URL that's give just the struct but without any value. even when i copy the content of the XmlVast in a file and I try to Unmarshal it it give me the same responce the struct without any value.
Thank you in advance.
答案1
得分: 3
你正在尝试将一个根元素为<VAST>
的XML文档解组为类型为VastHtml
的结构体,该结构体的第一个字段是VAST
。
如果你想要解码为VAST
元素,请直接将其传递给Unmarshal
函数。
err = xml.Unmarshal(xmlDataFromHttp, &xmlData.VAST)
英文:
You are trying to unmarshal an xml document with a root of <VAST>
into a struct of type VastHtml
, which contains VAST
as its first field.
Pass the VAST
element directly to the Unmarshal
function if that is what you want to decode into.
err = xml.Unmarshal(xmlDataFromHttp, &xmlData.VAST)
答案2
得分: 3
XML输入在根部分有一个<VAST>
元素,对应于您的结构中的VastHtml.VAST
字段。因此,将其作为目标值传递给xml.Unmarshal
:
err = xml.Unmarshal(xmlDataFromHttp, &xmlData.VAST)
(我同意Lander的观点,深层嵌套的结构定义将来可能会成为一个问题)。
英文:
The XML input has a <VAST>
element at the root -- this corresponds to the VastHtml.VAST
field in your struct. So, pass that to xml.Unmarshal
as the target value:
err = xml.Unmarshal(xmlDataFromHttp, &xmlData.VAST)
(I agree with Lander that the deeply-nested struct definition is going to be a problem going forward).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论