Попытка использовать Golang encoding / xml для кодирования структуры в xml структуру с чередующимся повторяющимся шаблоном - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать файл xml со следующим порядком, используя пакет encoding / xml, и я определил структуры для подэлемента stati c и подэлемента перехода, теперь проблема в том, что мне нужно иметь это в повторяющемся формате, поэтому я создал другую структуру для хранения срезов как stati c, так и переходных структур, но в результате все элементы stati c появляются перед элементом перехода, но мне нужно, чтобы они чередовались по порядку. Это структура, которую я хочу:

<background>
    //...
    <static>
        <duration></duration>
        <file></file>
    </static>

    <transition>
        <duration>
        <from></from>
        <to></to>
    </transition>

    <static>
        <duration></duration>
        <file></file>
    </static>

    <transition>
        <duration>
        <from></from>
        <to></to>
    </transition>
    //...
</background>

, но вот что я получаю:

<background>
    //...
    <static>
        <duration></duration>
        <file></file>
    </static>
    <static>
        <duration></duration>
        <file></file>
    </static>

    <transition>
        <duration>
        <from></from>
        <to></to>
    </transition>
    <transition>
        <duration>
        <from></from>
        <to></to>
    </transition>
    //...
</background>

Любая помощь относительно того, как я могу это сделать. Вот созданные мной структуры:

type Static struct {
Duration int    `xml:"duration"`
File     string `xml:"file"`
}
type Transition struct {
    Duration float64 `xml:"duration"`
    From     string  `xml:"from"`
    To       string  `xml:"to"`
}
type ST struct {
    Static     []Static     `xml:"static"`
    Transition []Transition `xml:"transition"`
}

type Background struct {
    XMLName   xml.Name  `xml:"background"`
    Comment   string    `xml:",comment"`
    ST
}

1 Ответ

0 голосов
/ 05 мая 2020

Этот

type Static struct {
    XMLName  string `xml:"static"`
    Duration int    `xml:"duration"`
    File     string `xml:"file"`
}

type Transition struct {
    XMLName  string  `xml:"transition"`
    Duration float64 `xml:"duration"`
    From     string  `xml:"from"`
    To       string  `xml:"to"`
}

type Background struct {
    XMLName string `xml:"background"`
    Items   []interface{}
}

bk := Background{
    Items: []interface{}{
        &Static{
            Duration: 11,
            File:     "foo",
        },
        &Transition{
            Duration: 22,
            From:     "aaa",
            To:       "bbb",
        },
        &Static{
            Duration: 33,
            File:     "bar",
        },
        &Transition{
            Duration: 44,
            From:     "xxx",
            To:       "yyy",
        },
    },
}

out, err := xml.Marshal(&bk)

должен иметь вашу закрытую ( игровую площадку ).

Обратите внимание, что для получения правильно сериализованного - в смысле следующего за другой в указанном порядке - список элементов, вы должны использовать структуру данных, которая это отражает; В этом простом случае лучше всего подходит срез Go.

В сложных случаях можно сделать так, чтобы ваш настраиваемый тип реализовывал интерфейс encoding/xml.Marshaler и использовал средства encoding/xml нижнего уровня для кодирования отдельных эменетов в любом заказать вам wi sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...