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

问题描述 投票:0回答:1

我有一个尝试解析的示例。我可以获取<Documents>,但无法获取<ChangeOrders>。我将在此站点上其他几个问题中看到的内容结合在一起,尤其是这些问题:Unmarshaling XML in Gogolang xml UnmarshalGolang 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": ""
    }
  }

额外问题:为什么兽医抱怨这些话?

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

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

xml go
1个回答
1
投票

删除根级别标签:

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

XML解码器假定document元素对应于您要对其解码的结构。因此,实际的XML元素/结构字段匹配从document元素下开始。

© www.soinside.com 2019 - 2024. All rights reserved.