我有这个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
答案 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>
}