我知道这样做有点奇怪,但这是集成测试的一部分,我正在测试系统是否不会被
\0
欺骗,以 URL 编码 %%0
发送。系统确实没有被欺骗,并将该值作为 XML 错误回显。但我的测试代码在尝试解析它时失败了。这是 IMO 有效的 XML:
<Error>
<Code>1234</Code>
<Message>Test�afterzero</Message>
</Error>
但是这段代码会出现错误,而不是带有
\0
的字符串:
package main
import (
"encoding/xml"
"fmt"
)
type ErrorMsg struct {
XMLName xml.Name `xml:"Error"`
Code string `xml:"Code"`
Message string `xml:"Message"`
}
func main() {
var data = []byte(`
<Error>
<Code>1234</Code>
<Message>Test�afterzero</Message>
</Error>
`)
b := ErrorMsg{}
o := xml.Unmarshal([]byte(data), &b)
fmt.Println(o)
fmt.Println(b)
}
请参阅此处的示例:https://go.dev/play/p/1fKyuzZPUM8
我可以做点什么吗?我想我可以放弃这个测试 - 我确实检查过它不会使系统崩溃,这确实是很奇怪的极端情况,但我有点想保留它。
我可以告诉 XML 以某种方式接受这个吗?
这是 IMO 有效的 XML
这不是有效的 XML。
�
字符不是有效的 XML 字符,不能出现在 XML 文档中。任何 XML 解析器都将无法解析。
请参阅规范:https://www.w3.org/TR/xml/#charsets
字符范围
[2] 字符 ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 任何 Unicode 字符,不包括代理块、FFFE 和 FFFF。 */
XML 中不允许使用该字符。因此,如果字符超出了允许的范围,您可能需要找到一种不同的方式来指示该字符是什么。