我无法在 golang 中修改 c 节点的值。我想获取一些节点值(可以),并将一些节点值(例如在“”之间)重置为以下值,但是它有一些问题。怎么做?欢迎您提供帮助: package main import ( "fmt" "regexp" ) type C struct { XMLName xml.Name `xml:"c"` V string `xml:"v,omitempty"` R string `xml:"r,attr"` T string `xml:"t,attr,omitempty"` S string `xml:"s,attr"` } type Row struct { XMLName xml.Name `xml:"row"` R string `xml:"r,attr"` C []C `xml:"c"` Spans string `xml:"spans,attr"` } type Result struct { XMLName xml.Name `xml:"sheetData"` Row []Row `xml:"row"` } func main() { input := ` <sheetData> <row r="2" spans="1:15"> <c r="A2" s="5" ><v>{{range .txt}}</v></c> <c r="B2" s="5" t="s"><v>1</v></c> <c r="C2" s="5" t="s"><v>2</v></c> <c r="D2" s="5" t="s"><v>3</v></c> <c r="E2" s="5" /> <c r="K2" s="6" t="s"><v>21</v></c> </row> <row r="3" spans="1:15"> <c r="A3" s="5" t="s"><v>0</v></c> <c r="B3" s="5" t="s"><v>1</v></c> <c r="C3" s="5" t="s"><v>2</v></c> <c r="D3" s="5" t="s"><v>3</v></c> <c r="E3" s="5" /> <c r="K3" s="6" t="s"><v>21</v></c> </row> </sheetData>` v := Result{} err := xml.Unmarshal([]byte(input), &v) if err != nil { fmt.Printf("error: %v", err) return } for _, r := range v.Row { for _, c := range r.C { c.V="25" //i want the set some c node value. fmt.Printf("%v %v %v\n", c.V, c.R,c.T) } } output, err := xml.MarshalIndent(&v, "", "") if err != nil { fmt.Printf("error: %v\n", err) } fmt.Println(string(output)) //but the c node value is still original} } 以上有什么问题?如何在golang中设置一些节点值?
1 回答
HUH函数
TA贡献1836条经验 获得超4个赞
这是一个工作示例(使用 XML 标识):Playground
解释:
您正在 for 循环中复制结构。写作时
for _, r := range v.Row {
r
是中值的副本v.Row
。如果您随后尝试更改该值,您只会更改副本,但原始值不会更改。
你应该像这样写你的循环
for i := range v.Row {
并v.Row[i]
改为访问结构。
这同样适用于您的内部循环,它应该这样写:
for j := range v.Row[i].C {
然后你可以改变列
v.Row[i].C[j].V = "25"
(可选)您可以通过写入获取对列的引用c := &v.Row[i].C[j]
,然后将值更改为c.V = "25"
- 1 回答
- 0 关注
- 167 浏览
添加回答
举报
0/150
提交
取消