#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
.
Комментарии:
1. Эй, спасибо, ваш ответ действительно помог мне понять.