在golang中如何编码包含空格的xml参数?

时间:2017-09-13 18:36:10

标签: xml go

我有这个xml api构造我需要使用(这个构造不是由我定义的,我无法改变它):

<path><farmer id="ME7"/></path>

我去了:

type Path struct {
  XMLName xml.Name `xml:"path"`
  FarmerId string `xml:"farmer id,attr"`
}

pMux := &Path{FarmerId: "ME7"}

然而,请对pMux进行编码并将其打印为:

<path xmlns:farmer="farmer" farmer:id="ME7" </path>

我想要的是:

<path><farmer id="ME7"/> </path>

我怎样才能做到这一点?

THX

2 个答案:

答案 0 :(得分:1)

这不是有效的XML。

我会仔细检查你提到的API合约,因为它不太可能需要无效的XML。

最接近你的是这个有效的XML。

<path><farmer id="ME7"></farmer></path>

为了生成上述(有效)XML,您应该将类​​型定义为:

type Farmer struct {
   XMLName   xml.Name    `xml:"farmer"`
   Id        string      `xml:"id,attr"`
}

type Path struct {
    XMLName xml.Name `xml:"path"`
    Farmer  Farmer   `xml:"farmer"`
}

然后将值创建为:

v := Path{Farmer: Farmer{Id: "ME7"}}

请点击此处查看正在运行的示例:https://play.golang.org/p/abEqMc6HdK

答案 1 :(得分:1)

XML无效,但是如果您确实需要它,那么请使用正则表达式来修复它。这是一个例子。

我假设您确实希望开放代码的有效性与<path farmer id="ME7"></path>一样有效,而不是在发布<path farmer id="ME7" </path>时没有使开放代码有效,但无论哪种方式都可以使用正则表达式。

顺便说一下,你的问题与你想要的不一致。你首先想要<path><farmer id="ME7"></path>,@ eugenioy的答案将适应。然后结束&#34;我想要的是:<path farmer id="ME7" </path>&#34;。我的答案是针对的。

https://play.golang.org/p/A-sJhIgFZW

package main

import (
    "encoding/xml"
    "fmt"
    "regexp"
)

type Path struct {
    XMLName  xml.Name `xml:"path"`
    Farmer   string   `xml:"farmer,attr"`
    FarmerId string   `xml:"id,attr"`
}

func main() {
    path := &Path{
        FarmerId: "ME7",
    }
    data, err := xml.Marshal(path)
    if err != nil {
        fmt.Println(err)
        return
    }

    strData := string(data)

    // fix with regex
    reg := regexp.MustCompile(`(farmer)(="")`)
    strData = reg.ReplaceAllString(strData, "$1")
    fmt.Println(strData) // <path farmer id="ME7"></path>
}