разархивируйте xml с атрибутами

#xml #go

#xml #Вперед

Вопрос:

Возникли проблемы с получением xml в unmarshal, чтобы я мог получить доступ к атрибутам xml. Не уверен, что я делаю неправильно на данный момент. Он соответствует, но структура, похоже, не содержит никаких данных.

 import (
    "io/ioutil"
    "encoding/xml"
    "fmt"
)
  

содержимое xml:

   <module id="Core" description="Core Module" tenantId="tenant1" major="3" minor="4" patch="0" build="0">
    <probePath path="bin" />
  </module>
</metadata>
  
 type ModuleField struct {
    Id string `xml:"id,attr"`
    Description string `xml:"description,attr"`
    TenantId string `xml:"tenantId,attr"`
    Major string `xml:"major,attr"`
    Minor string `xml:"minor,attr"`
    Patch string `xml:"patch,attr"`
}

type Module struct {
    ModuleField ModuleField
    ProbePath string `xml:"probePath"`
}

type Metadata struct {
    XMLName xml.Name `xml:"metadata"`
    Module Module
}
  
 
// read xml file
    raw, _ := ioutil.ReadFile(XMLLoc)
    if err != nil {
        return
    }


    var XMLData Metadata 
    xml.Unmarshal(raw, amp;XMLData)

    // nothing is being printed
    fmt.Println(">",XMLData.Module.ModuleField.TenantId,"<")


  

Комментарии:

1. Все ваши атрибуты находятся в module элементе, но поля относятся не к тому Module типу, который вы используете для представления этого элемента, а к другому типу, который настроен так, как будто вы ожидаете ModuleField дочерний элемент, которого не существует.

Ответ №1:

Регистр букв имеет значение, поэтому элемент module не будет преобразован в вызываемое поле Module , вам нужно добавить соответствующий тег. Также вам нужно будет встроить ModuleField в Module , чтобы его поля были повышены до Module , и только тогда они будут отменены. Или, в качестве альтернативы, вы можете удалить ModuleField и переместить все его поля в Module .

https://play.golang.org/p/AvaEpcKY-oh

Комментарии:

1. Эй, спасибо, ваш ответ действительно помог мне понять.