Используйте пакет encoding/xml
с функцией EscapeText
:
package main
import (
"bytes"
"encoding/xml"
"fmt"
)
func Xml(in string) string {
var b bytes.Buffer
xml.EscapeText(&b, []byte(in))
return b.String()
}
func main() {
fmt.Println(`<?xml profile><test>` + Xml(`test '123'`) + `</test>`)
}
Это даст выход: test '123'
Go имеет отличную поддержку XML в encoding/xml
, и есть другие способы создания выходных данных, которые не требуют ручного конструирования XML.
Эта версия выполняет перенос в элемент <test>
, а также позволяет передавать interface{}
для EncodeElement
метода, так что вы не ограничены строками:
package main
import (
"encoding/xml"
"os"
)
func main() {
s := `test '123'`
test := xml.StartElement{Name:xml.Name{Local:`test`}}
xml.NewEncoder(os.Stdout).EncodeElement(s, test)
}
Наконец, и, вероятно, лучше всего, эта версия использует stuct
и .Encode
метод :
package main
import (
"encoding/xml"
"os"
)
type Test struct {
XMLName xml.Name `xml:"test"`
Content string `xml:",chardata"`
}
func main() {
s := Test{Content:`test '123'`}
xml.NewEncoder(os.Stdout).Encode(&s)
}
Теперь вы можете расширить структуру, но, что лучше всего, вы также можете Unmarshal
или Decode
этого типа, чтобы извлечь данные из входящих XML:
package main
import (
"bytes"
"encoding/xml"
"fmt"
)
type Test struct {
XMLName xml.Name `xml:"test"`
Content string `xml:",chardata"`
}
func main() {
s := Test{Content:`test '123'`}
var buf bytes.Buffer
xml.NewEncoder(&buf).Encode(&s)
fmt.Println("Encoded =", buf.String())
var read Test
xml.NewDecoder(bytes.NewReader(buf.Bytes())).Decode(&read)
fmt.Println("Content =", read.Content)
}
См. Документацию по xml.Marshal
для полного описания тегов, поддерживаемых пакетом xml: https://golang.org/pkg/encoding/xml/#Marshal