我正在使用默认的Woodstox EventReader读取XML文件,例如:
XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(fileName));如果输入文件的某些文本内容中恰好包含Unicode空字符,则会发生以下异常/Stacktrace:
WstxUnexpectedCharException.<init>(String, Location, char) line: 17
ValidatingStreamReader(StreamScanner).constructNullCharException() line: 604
ValidatingStreamReader(StreamScanner).throwInvalidSpace(int, boolean) line: 633
ValidatingStreamReader(BasicStreamReader).readTextSecondary(int, boolean) line: 4624
ValidatingStreamReader(BasicStreamReader).finishToken(boolean) line: 3661
ValidatingStreamReader(BasicStreamReader).next() line: 1063
WstxEventReader(Stax2EventReaderImpl).nextEvent() line: 255 我希望避免验证文本内容。在XMLInputFactory上设置IS_VALIDATING不能解决问题。
检查源代码后,BasicStreamReader的next()似乎引用了"mValidateText“变量来确定是否验证。
来自源代码:
/**
* Flag that indicates that textual content (CDATA, CHARACTERS) is to
* be validated within current element's scope. Enabled if one of
* validators returns {@link XMLValidator#CONTENT_ALLOW_VALIDATABLE_TEXT},
* and will prevent lazy parsing of text.
*/
protected boolean mValidateText = false;我似乎想不出如何在InputFactory或EventReader中更改/设置此值?也许我需要指示InputFactory不使用ValidatingStreamReader,而是使用TypedStreamReader?
发布于 2013-01-26 17:12:20
需要一个符合规范的XML解析器来拒绝格式错误的内容。您需要修复您的(非)XML,并让解析器完成它的工作。
发布于 2013-01-26 11:54:07
这不是验证,而是基本的格式良好性问题。验证与DTD、RelaxNG或XML Schema等模式一起使用,这些模式可以为文本内容定义特定的结构或值。因此,与验证相关的设置不会产生任何影响,因为如果内容是格式良好的XML,则会对此进行处理。
您需要做的是对内容进行预处理,以删除或替换少量在XML中非法的字符。这包括0字节。
https://stackoverflow.com/questions/14530963
复制相似问题