xml - 解析 xml(来自 Oracle Agile)返回 nil

标签 xml go

我有一个我试图解析的例子。我可以得到 <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
}

Go playground link

如果你运行它,我会在 Documents[] 中取回数据, 但是 ChangeOrder为空白。我不确定我错过了什么。
"ChangeOrder": {
    "CoverPage": {
      "Number": ""
    }
  }

额外问题:为什么去 vert 提示这些线?
    Documents   []Document  `xml: "AgileData>Documents"`
    ChangeOrder ChangeOrder `xml: "AgileData>ChangeOrders"`

如果我删除“xml:”和“AgileData..”之间的空格,警告就会消失,但 Documents[] 数组开始返回空。

最佳答案

删除根级别标签:

    Documents   []Document  `xml:"Documents"`
    ChangeOrder ChangeOrder `xml:"ChangeOrders"`

XML 解码器假定文档元素对应于您将其解码到的结构。所以实际的 XML 元素/结构字段匹配从文档元素开始。

关于xml - 解析 xml(来自 Oracle Agile)返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58863801/

相关文章:

java - Android ADT 插件无法在 Eclipse 上打开 XML 文件

php - 填充下拉选择列表

c++ - Tinyxml2 根集属性

go - 加扰/解扰整数值到/从十六进制字符串

go - 对goroutines中的延迟感到困惑

go - 分配给 slice 的值与指针

go - 如何仅针对更改的模板运行 gogenerate?

android - LinearLayout 水平推送 View 离屏

android - 如何在 android layer-list xml 文件中呈现文本?

go - 如何更改 IBM-Cloud cloudfoundry golang 应用程序版本?