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

在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

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

但是go对pMux进行编码并按如下方式打印:

<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>
}