func Encode(),编码xml的所有部分

时间:2018-09-05 09:18:32

标签: xml string go marshalling

这是代码:

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

func main() {
type body struct {
    Message string `xml:"message"`
}
myXml := body{
    Message:"This is <myText>",
}

    w := &bytes.Buffer{}
        enc := xml.NewEncoder(w)
        enc.Indent("", "  ")
        if err := enc.Encode(myXml); err != nil {
            panic(err)
        }
        request := w.String()
        fmt.Println(request)
    }

有什么方法可以不对字段消息的值进行编码。我不希望进行编码。 这是结果:

<body>
  <message>This is &lt;myText&gt;</message>
</body>

1 个答案:

答案 0 :(得分:1)

使用encoding/xml的目的是产生有效 XML文档。对于有效的XML,必须转义<>字符。不用担心,<message>的内容将是This is <myText>,但是此文本在XML源中必须显示为This is &lt;myText&gt;

请注意,使用xml:",innerxml"标签值可以强制输出xml.Marshal()中记录的原始XML数据:

- a field with tag ",innerxml" is written verbatim, not subject
  to the usual marshaling procedure.

赞:

type rawxml struct {
    Data string `xml:",innerxml"`
}
type body struct {
    Message rawxml `xml:"message"`
}
myXml := body{
    Message: rawxml{"This is <myText>"},
}

这将输出(在Go Playground上尝试):

<body>
  <message>This is <myText></message>
</body>

或者实现并使用自定义xml.Marshaler,但是这是无效的XML ,这不是您想要的。您现在拥有的正是您想要的。