golang不能修改xml节点值?
Can't modify the xml node value by golang?
我无法在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中设置一些节点值?
这是一个工作示例(使用 XML 的标识):Playground
解释:
您正在您的 for 循环中复制您的结构。
写作时
for _, r := range v.Row {
r
是 copy 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"
我无法在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中设置一些节点值?
这是一个工作示例(使用 XML 的标识):Playground
解释:
您正在您的 for 循环中复制您的结构。 写作时
for _, r := range v.Row {
r
是 copy 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"