xml.Unmarshal - 解析空字符实体产生错误:非法字符代码 U+0000

问题描述 投票:0回答:1

我知道这样做有点奇怪,但这是集成测试的一部分,我正在测试系统是否不会被

\0
欺骗,以 URL 编码
%%0
发送。系统确实没有被欺骗,并将该值作为 XML 错误回显。但我的测试代码在尝试解析它时失败了。这是 IMO 有效的 XML:

     <Error>
        <Code>1234</Code>
        <Message>Test&#0;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&#0;afterzero</Message>
          </Error>
       `)

    b := ErrorMsg{}
    o := xml.Unmarshal([]byte(data), &b)
    fmt.Println(o)
    fmt.Println(b)
}

请参阅此处的示例:https://go.dev/play/p/1fKyuzZPUM8

我可以做点什么吗?我想我可以放弃这个测试 - 我确实检查过它不会使系统崩溃,这确实是很奇怪的极端情况,但我有点想保留它。

我可以告诉 XML 以某种方式接受这个吗?

xml go unmarshalling null-character
1个回答
0
投票

这是 IMO 有效的 XML

这不是有效的 XML。

&#0;
字符不是有效的 XML 字符,不能出现在 XML 文档中。任何 XML 解析器都将无法解析。

请参阅规范:https://www.w3.org/TR/xml/#charsets

字符范围

[2] 字符 ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 任何 Unicode 字符,不包括代理块、FFFE 和 FFFF。 */

XML 中不允许使用该字符。因此,如果字符超出了允许的范围,您可能需要找到一种不同的方式来指示该字符是什么。

© www.soinside.com 2019 - 2024. All rights reserved.