2

私は、XMLを使用してジオメトリを記述するCollada形式のファイルを生成するプログラムを作成することでGoを学習しています。

構造体に注釈を付けると、配列を1つのXML要素にマーシャリングする方法がわからないことを除いて、ほとんどすべてが期待どおりに機能します。私は常にN個の要素を生成することになります。

言い換えれば、私は欲しいです

<input>
    <p>0 1 2</p>
</input> 

それ以外の

<input>
    <p>0</p>
    <p>1</p>
    <p>2</p>
</input> 

コードは次のとおりです

package main

import (
    "encoding/xml"
    "os"
)

func main() {
    type Vert struct {
        XMLName xml.Name    `xml:"input"`
        Indices     []int   `xml:"p"`
    }

    v := &Vert{Indices:[]int{0, 1, 2}}
    output, err := xml.MarshalIndent(v, "", "    ")
    if err == nil {
        os.Stdout.Write(output)
    }
}

encoding / xml / marshal.goからのさまざまなコメント(およびコード)は、私が運が悪かったことを示唆しているようです。

//マーシャリングは、各要素をマーシャリングすることによって配列またはスライスを処理します。
//スライスと配列は要素を反復処理します。囲みタグはありません。

不思議なことに、配列タイプをuint8に変更すると、配列はまったくマーシャリングされません。

運が悪ければ、おそらくxml: "、innerxml"アノテーションを使用して配列を自分で置き換えます。

4

2 に答える 2

1

ご想像のとおり、encoding/xmlはこれをそのままでは実行できません。代わりに、次のようなことを行うことができます。

import (
    "strconv"
    "strings"
)

type Vert struct {
    P string `xml:"p"`
}

func (v *Vert) SetIndices(indices []int) {
    s := make([]string, len(indices))
    for i := range indices {
        s[i] = strconv.FormatInt(int64(indices[i]), 10)
    }
    v.P = strings.Join(s, " ")
}

編集:私はもともとセッターの代わりにゲッターを書きました。

于 2012-12-10T06:13:18.940 に答える
0

最後に、タイプをに変更して属性stringを使用することにより、このタイプの配列に対して独自のxmlマーシャリングを実行しました。innerxml

package main

import (
    "encoding/xml"
    "os"
    "fmt"
    "bytes"
)

func MyMarshalArray(indices []int) string {
    var buffer bytes.Buffer

    buffer.WriteString("<p>")
    for i := 0; i < len(indices); i++ {
        buffer.WriteString(fmt.Sprintf("%v ", indices[i]))
    }
    buffer.WriteString("</p>")
    return buffer.String()
}

func main() {
    type Vert struct {
        XMLName xml.Name    `xml:"input"`
        Indices     string  `xml:",innerxml"`
    }

    v := &Vert{Indices:MyMarshalArray([]int{0, 1, 2})}
    output, err := xml.MarshalIndent(v, "", "    ")
    if err == nil {
        os.Stdout.Write(output)
    }
}
于 2012-12-12T05:02:39.377 に答える