我正在使用 JAXB unmarshal
方法将 XML 数据转换为 java 对象。代码可以工作,但当其中一个 XML 标记中存在无效数据时,该方法会引发异常并立即停止,例如
org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte UTF-8 sequence.]
org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 45; An invalid XML character (Unicode: 0x1) was found in the element content of the document.]
我想要的不是立即抛出异常,而是通过将无效数据替换为空格或空字符串(即剥离它们并继续)来尽可能多地转换 XML 数据。
有没有办法让解码器做到这一点?
或者,如果有办法让解码器从停止的地方继续, try catch 异常就可以了(不太理想)。
显然,在解码之前先对 XML 进行预处理以去除所有无效数据是另一种方法,除非没有其他方法,否则并不可取,因为它只意味着处理 XML 数据两次。
如果 JAXB 无法执行我想要的操作,欢迎使用其他解码器。
最佳答案
首先,您询问的是格式不正确的 XML,而不是无效的 XML。格式不正确的 XML 违反了 XML 的规则(从技术上讲,它不是 XML)。无效的 XML 只是违反了 XML 模式给出的规则。请参阅Well-formed vs Valid XML 了解更多详情。
考虑到这一背景,很容易看出问题:格式不正确的 XML 甚至无法解析,因此所有兼容的 XML 工具都将无效。 (请记住,此类数据甚至不是真正的 XML。)您应该做的是从源头上解决问题:修复生成“错误 XML”的代码。
如果无法修复错误代码,请参阅 How to parse invalid (bad / not well-formed) XML?
关于java - 有没有办法在解码到 Java 对象时替换无效的 XML 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61334435/