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