无法通过golang修改xml节点值?

时间:2015-01-20 08:14:25

标签: xml struct go xlsx

我无法在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 个答案:

答案 0 :(得分:4)

这是一个工作示例(使用XML的标识):Playground

说明:

您正在for循环中复制结构。 写作时

for _, r := range v.Row {

rv.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"

来获取对该列的引用