Генерация XML в указанном формате c из структуры - PullRequest
1 голос
/ 14 февраля 2020

Мне нужно сгенерировать xml из структуры:

<doc>
    <item name='documentCommand' value='i' />
    <item name='documentType' value='1' />
    <item name='offset' value='0' />
    <item name='bytesRead' value='63636' />
    <item name='bDoneUpload' value='false' />
    <item name='documentVar' value='' />
    <item name='vendorFileName' value='/example.pdf' />
</doc>

У меня есть следующая структура:

type XMLDoc struct {
    XMLName         xml.Name `xml:"doc"`
    DocumentCommand string   `xml:"documentCommand"`
    DocumentType    string   `xml:"documentType"`
    Offset          string   `xml:"offset"`
    BytesRead       string   `xml:"bytesRead"`
    DoneUpload      string   `xml:"bDoneUpload"`
    DocumentVar     string   `xml:"documentVar"`
    FileName        string   `xml:"vendorFileName"`
}

Использование xml. Маршал дает мне это и это неприемлемо для конечной точки:

<doc>
    <documentCommand>i</documentCommand>
    <documentType>27</documentType>
    <offset>27181</offset>
    <bytesRead>0</bytesRead>
    <bDoneUpload>true</bDoneUpload>
    <documentVar></documentVar>
    <vendorFileName>testdoc.pdf</vendorFileName>
</doc>

Тогда конечная точка сообщает мне, что логическое значение строки bDoneUpload недопустимо.

Как правильно создать желаемый XML?

1 Ответ

0 голосов
/ 14 февраля 2020

Если вы хотите этот конкретный c заказ для ваших XML item, то вы можете использовать срез примерно так:

type XMLDoc struct {
    XMLName xml.Name `xml:"doc"`
    Items   []Item   `xml:"item"`
}

type Item struct {
    Name  string `xml:"name,attr"`
    Value string `xml:"value,attr"`
}

и использовать:

v := XMLDoc{
    Items: []Item{
        Item{"documentCommand", "i"},
        Item{"documentType", "1"},
        /* ... */
    },
}

Детская площадка рабочий пример .


Вы также можете создать пользовательский XML Marshaler , чтобы отобразить XML в точности так, как вы хотите, например,

type XMLDoc struct {
    Comment    string
    Type       string
    Offset     int
    Read       int
    DoneUpload bool
    Var        string
    VenderPath string
}

func (x XMLDoc) MarshalXML(e *xml.Encoder, start xml.StartElement) (err error) { /* ... */ }
  • Pro: можно использовать нативные go -типы типа int, bool et c. для полей
  • Con: Marshaler может быть утомительно писать: https://play.golang.org/p/KZ-HKgNHmbE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...