首页 > 解决方案 > 如何将字符串转换为 XML

问题描述

我有一个字符串格式的 XML,有人可以帮我将 XML 字符串转换为正确的 XML 格式吗?

package main

import "fmt"

func main() {

    message := `<?xml proflie ><test> value '123'</test>`
    fmt.Printf("%s", message)
}

标签: xmlgo

解决方案


使用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 &#39;123&#39;

Go 在包中对 XML 有很好的支持encoding/xml,还有其他方法可以生成输出,而不涉及手动构建 XML。

此版本在<test>元素中进行包装,还允许您将 an 传递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)
}

最后,也许是最好的,这个版本使用 astuct.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)
}

现在您可以扩展该结构,但最重要的是,您还可以UnmarshalDecode这种类型,从传入的 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


推荐阅读