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

时间:2015-01-19 13:29:47

标签: xml go marshalling unmarshalling

我有一个小struct我希望使用encoding/xml包进行编组和解组:

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

当我使用encoding/json包时,编码/解码工作正常。

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

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

1 个答案:

答案 0 :(得分:3)

您正在尝试解析XML,就好像它是JSON一样。首先你做

data, err := xml.Marshal(p)

然后

err = json.Unmarshal(data, &pXml)

代码中的第46行应为

err = xml.Unmarshal(data, &pXml)