【发布时间】:2019-06-18 04:24:55
【问题描述】:
在读取请求正文时,很少有 XML 标记没有被解码
我已经用 json 和 xml 标签定义了我的嵌套结构,因为我想在 json 和 xml 中使用相同的模式来请求和响应。
var dataNewTestplans DataTestplan
err := xml.NewDecoder(r.Body).Decode(&dataNewTestplans)
xmlData, _ := xml.Marshal(dataNewTestplans)
fmt.Printf(string(xmlData))
DataTestplan 结构:
type DataTestplan struct {
Data []Testplan `json:"data" xml:"data"`
}
测试计划结构:
type Testplan struct {
Group string `json:"group" xml:"group"`
Name string `json:"name" xml:"name"`
Parameters []Parameter `json:"parameters,omitempty" xml:"parameters,omitempty"`
Released bool `json:"released" xml:"released"`
Teststeps []Teststep `json:"teststeps,omitempty" xml:"teststeps,omitempty"`
Version int32 `json:"version" xml:"version"`
}
参数结构:
type Parameter struct {
XMLName xml.Name `xml:"parameters"`
Comment string `json:"comment" xml:"comment"`
Description string `json:"description,omitempty" xml:"description,omitempty"`
}
测试步结构:
type Teststep struct {
XMLName xml.Name `xml:"teststeps"`
AslID string `json:"aslId,omitempty" xml:"aslID"`
Bin int32 `json:"bin,omitempty" xml:"bin"`
}
XML 发送:
<root>
<data>
<element>
<group>TEST</group>
<name>TEST</name>
<parameters>
<element>
<comment>test</comment>
<description>test</description>
</element>
<element>
<comment>test1</comment>
</element>
</parameters>
<released>true</released>
<teststeps>
<element>
<bin>32</bin>
</element>
</teststeps>
<version>1</version>
</element>
</data>
</root>
XML 解码:
<DataTestplan>
<data>
<group></group>
<name></name>
<released>false</released>
<version>0</version>
</data>
</DataTestplan>
我知道缺少标签很可能是因为结构定义中缺少 xml 标记,但我不确定为什么解码后的信息缺少标签值? XML 和 JSON 编码有什么技巧?
【问题讨论】:
-
只需根据您的定义检查您的 XML,或者在 Go 中完整填写一个结构并将其导出为 XML,然后将其与您的输入进行比较。我马上就看到了一些事情;您的根元素是
root,而不是DataTestPlan,因此需要添加XMLName,并且XML 中出现element元素的多个位置根本没有映射到您的结构中(结构定义只是忽略它并尝试映射其子项,就好像它不存在一样)。 -
它是否“不是结构”并不重要,它需要在您的映射中处理。你不能假装它不存在。例如。
Parameters不应该是一个切片,因为只有一个parameters元素。parameters包含一部分element元素。
标签: xml go struct xmlhttprequest