我在 UTF-8 ( )中有一个String
包含二进制文件的二进制文件。JAXB 愉快地编组包含此类字符的 XML 文档,但随后无法解组:0
"A\u0000B"
final JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);
final Marshaller marshaller = jaxbContext.createMarshaller();
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Root root = new Root();
root.value = "A\u0000B";
final ByteArrayOutputStream os = new ByteArrayOutputStream();
marshaller.marshal(root, os);
unmarshaller.unmarshal(new ByteArrayInputStream(os.toByteArray()));
根类很简单:
@XmlRootElement
class Root { @XmlValue String value; }
输出 XML 包含和之间的二进制以及0
(十六进制:),这会在解组期间导致以下错误:A
B
41 00 42
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 63;
An invalid XML character (Unicode: 0x0) was found in the element content of the document.
有趣的是,使用原始 DOM API ( example ) 会产生 escaped 0
:A�B
但尝试读回它会产生类似的错误。此外,任何 XML 解析器或(另请参见:Python + Expat: Error on entity0
)都不允许(二进制或转义)。xmllint
我的问题:
为什么 JAXB/DOM API 允许创建无法读取的无效XML 文档?它不应该在编组期间快速失败吗?
有一些优雅的全球解决方案吗?我看到人们通过以下方式解决这个问题:
但是,Java 中成熟的 XML 堆栈(我使用的是 1.7.0_05)不应该默认或通过一些简单的设置来处理这个问题吗?我正在寻找转义、忽略或快速失败 - 但生成无效 XML 的默认行为是不可接受的。我相信这样的基本功能不需要在客户端进行任何额外的编码。