我有一个尝试解析的示例。我可以获取<Documents>
,但无法获取<ChangeOrders>
。我将在此站点上其他几个问题中看到的内容结合在一起,尤其是这些问题:Unmarshaling XML in Go,golang xml Unmarshal,Golang XML parse
下面是我到目前为止写的内容:
package main
import (
"bytes"
"encoding/json"
"encoding/xml"
"fmt"
"log"
)
type AgileData struct {
Documents []Document `xml: "AgileData>Documents"`
ChangeOrder ChangeOrder `xml: "AgileData>ChangeOrders"`
}
type ChangeOrder struct {
CoverPage CoverPage `xml:"CoverPage"`
}
type CoverPage struct {
Number string `xml:"Number"`
}
type Document struct {
TitleBlock TitleBlock `xml:"TitleBlock"`
Attachments []Attachments `xml:"Attachments"`
}
type TitleBlock struct {
Number string `xml:"Number"`
LifecyclePhase string `xml:"LifecyclePhase"`
Rev string `xml:"Rev"`
EffectivityDate string `xml:"EffectivityDate"`
}
type Attachments struct {
FileName string `xml:"FileName"`
EFD string `xml:"List01"`
}
func main() {
agile_xml := `
<AgileData xmlns="http://www.oracle.com/webfolder/technetwork/xml/plm/2016/09/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://www.oracle.com/webfolder/technetwork/xml/plm/2016/09/ http://www.oracle.com/webfolder/technetwork/xml/plm/2016/09/aXML.xsd">
<ChangeOrders>
<CoverPage>
<Number>C0000001</Number>
</CoverPage>
</ChangeOrders>
<Documents>
<TitleBlock>
<Number>D00000001</Number>
<LifecyclePhase>Published</LifecyclePhase>
<Rev>001 C00000001</Rev>
</TitleBlock>
<Attachments>
<FileName>some-file.docx</FileName>
<List01>PDF with banners</List01>
</Attachments>
</Documents>
<Documents>
<TitleBlock>
<Number>D00000002</Number>
<LifecyclePhase>Published</LifecyclePhase>
<Rev>001 C00000001</Rev>
</TitleBlock>
<Attachments>
<FileName>some-other-file.docx</FileName>
<List01>No distribution</List01>
</Attachments>
</Documents>
</AgileData>
`
xmlReader := bytes.NewReader([]byte(agile_xml))
yourAgileData := new(AgileData)
if err := xml.NewDecoder(xmlReader).Decode(yourAgileData); err != nil {
log.Panic(err.Error())
}
printX(yourAgileData)
}
func printX(x interface{}) (err error) {
var xBytes []byte
xBytes, err = json.MarshalIndent(x, "", " ")
if err != nil {
return
}
fmt.Println(string(xBytes))
return
}
如果运行此命令,则会在Documents[]
中取回数据,但ChangeOrder
为空。我不确定我错过了什么。
"ChangeOrder": {
"CoverPage": {
"Number": ""
}
}
额外问题:为什么兽医抱怨这些话?
Documents []Document `xml: "AgileData>Documents"`
ChangeOrder ChangeOrder `xml: "AgileData>ChangeOrders"`
如果删除“ xml:”和“ AgileData ..”之间的空格,警告消失,但是Documents []数组开始返回空。
删除根级别标签:
Documents []Document `xml:"Documents"`
ChangeOrder ChangeOrder `xml:"ChangeOrders"`
XML解码器假定document元素对应于您要对其解码的结构。因此,实际的XML元素/结构字段匹配从document元素下开始。