在golang中,如何对包含空格的xml参数进行编码?
我需要使用这个xml api构造(这个构造不是我定义的,我无法更改): 但是go对pMux进行编码并按如下方式打印:在golang中,如何对包含空格的xml参数进行编码?,xml,go,Xml,Go,我需要使用这个xml api构造(这个构造不是我定义的,我无法更改): 但是go对pMux进行编码并按如下方式打印: <path xmlns:farmer="farmer" farmer:id="ME7" </path> 这是无效的XML <path><farmer id="ME7"></farmer></path> 我会仔细检查您提到的API契约,因为它们不太可能需要无效的XML <path><farmer
<path xmlns:farmer="farmer" farmer:id="ME7" </path>
这是无效的XML
<path><farmer id="ME7"></farmer></path>
我会仔细检查您提到的API契约,因为它们不太可能需要无效的XML
<path><farmer id="ME7"></farmer></path>
最接近的是这个有效的XML
<path><farmer id="ME7"></farmer></path>
然后将值创建为:
v := Path{Farmer: Farmer{Id: "ME7"}}
请参见此处的运行示例:XML无效,但如果确实需要这样的结果,请在以后使用正则表达式进行修复。这里有一个例子
我假设您确实希望open标记像这样有效
,而不是在发布时让open标记无效,您不能让XML元素或属性名称中有空格。这是无效的XML。@RayfenWindspear所以我说“元素或属性名”。两者中都不能有空格。好吧,这完全是无效的XML,因为farmer
没有结束标记,而且它本身也不关闭。您可以执行farmer>id,attr
?我不这么认为,但我不是100%肯定。@Volker,除非这只是更大的XML中的一小部分(很可能)。尝试将此作为另一个标记的值来执行,将导致
被XML编码。不过还是可以破解的。这可能比重新定义一个大的XML字符串更有效。如果XML必须像示例中那样最终无效,请删除带有reg:=regexp.MustCompile(())data=reg.ReplaceAllString(data,”)
的结束标记,非常感谢。我再次与api所有者进行了核对。根据他们的说法:如果XML元素不包含任何值或子元素,那么该元素可能会以“/>”结束。因此,从他们的角度来看,没有标签的自我终止是合法的。我认为golang不支持这种类型的终止。实际上,现在我想起来了,我自己也遇到过类似的情况,有人破坏了API实现。在我的例子中,我必须强制修改XML,使其具有一个自动关闭标记(go不支持),并且必须使用一个神奇的字符串插入多个XML名称空间(go也不支持,或者当时不支持)。
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"}}
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>
}