从 xml.Marshal() 的结果中解组 XML

Unmarshalling XML from result of xml.Marshal()

我有一个小的 struct,我想使用 encoding/xml 包编组和解组:

type Point struct {
    X, Y  int
    z     int // unexported
    Names []string
}

当我使用 encoding/json 包时,encoding/decoding 工作正常。

但是当我使用 encoding/xml 包时,只有 xml.Marshal() 有效, xml.Unmarshal() returns 错误:

invalid character '<' looking for beginning of value

这是我为XML做的:

p := Point{1, 2, 3, []string{"Bob", "Alice"}}
data, err := xml.Marshal(p)
if err != nil {
    fmt.Println("Error:", err)
}
fmt.Println("XML:", string(data))

var pXml Point
err = json.Unmarshal(data, &pXml)
if err != nil {
    fmt.Println("Error:", err)
}
fmt.Println("Unmarshalled XML:", pXml)

为什么会出现此错误以及如何解组 xml.Marshal() 返回的 XML 输出?

这是 Go Playground 上可运行的完整应用程序,可供试用。

应用程序的输出:

Input: {1 2 3 [Bob Alice]}
JSON: {"X":1,"Y":2,"Names":["Bob","Alice"]}
Unmarshalled JSON: {1 2 0 [Bob Alice]}

XML: <Point><X>1</X><Y>2</Y><Names>Bob</Names><Names>Alice</Names></Point>
Error: invalid character '<' looking for beginning of value
Unmarshalled XML: {0 0 0 []}

您正在尝试解组 XML,就好像它是 JSON。你先做

data, err := xml.Marshal(p)

然后

err = json.Unmarshal(data, &pXml)

您代码中的第 46 行应该是

err = xml.Unmarshal(data, &pXml)