将数组封送到go中的单个xml元素

将数组封送到go中的单个xml元素,xml,go,marshalling,Xml,Go,Marshalling,我通过编写一个程序来学习Go,该程序以XML描述几何图形的格式生成文件 对结构进行注释后,几乎所有内容都能正常工作,只是我不知道如何将数组封送到一个XML元素中——我总是生成N个元素 换句话说,我想 <input> <p>0 1 2</p> </input> 来自的各种评论(和代码)似乎暗示我运气不佳: //封送通过封送每个元素来处理数组或片。 //切片和数组在元素上迭代。它们没有封闭标记 奇怪的是,如果我将数组类型更改为uint8,则

我通过编写一个程序来学习Go,该程序以XML描述几何图形的格式生成文件

对结构进行注释后,几乎所有内容都能正常工作,只是我不知道如何将数组封送到一个XML元素中——我总是生成N个元素

换句话说,我想

<input>
    <p>0 1 2</p>
</input> 
来自的各种评论(和代码)似乎暗示我运气不佳:

//封送通过封送每个元素来处理数组或片。
//切片和数组在元素上迭代。它们没有封闭标记

奇怪的是,如果我将数组类型更改为uint8,则该数组根本不会被封送


如果我运气不好,我可能会自己使用xml:,innerxml注释来代替数组

正如您所猜测的,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, " ")
}

编辑:我最初编写了一个getter而不是setter。

最后,我为这种类型的数组进行了自己的xml编组, 通过将类型更改为
string
并使用
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)
    }
}
主程序包
进口(
“编码/xml”
“操作系统”
“fmt”
“字节”
)
func MyMarshalArray(索引[]int)字符串{
变量缓冲区字节。缓冲区
buffer.WriteString(“”)
对于i:=0;i”)
返回buffer.String()
}
func main(){
类型垂直结构{
XMLName xml.Name`xml:“输入”`
索引字符串'xml:,innerxml'`
}
v:=&Vert{index:mymarshallarray([]int{0,1,2})}
输出,错误:=xml.marshallindent(v,“,”)
如果err==nil{
os.Stdout.Write(输出)
}
}

这不是为了从XML中解包吗?AAAA你说得对。我在这么晚的时候试图回答问题,这是对的。:)固定的。
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, " ")
}
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)
    }
}