我有以下代码:
public XsdValidator(Resource... xsds) {
Preconditions.checkArgument(xsds != null);
try {
this.xsds = ImmutableList.copyOf(xsds);
SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
LOGGER.debug("Schema factory created: {}",schemaFactory);
StreamSource[] streamSources = streamSourcesOf(xsds);
LOGGER.debug("StreamSource[] created: {}",streamSources);
Schema schema = schemaFactory.newSchema(streamSources);
LOGGER.debug("Schema created: {}",schema);
validator = schema.newValidator();
LOGGER.debug("Validator created: {}",validator);
} catch ( Exception e ) {
throw new IllegalArgumentException("Can't build XsdValidator",e);
}
}
似乎行schemaFactory.newSchema(streamSources);
需要很长时间(30秒)才能对我的XSD文件执行。
经过对此XSD的多次测试后,似乎是因为我有:
<xs:complexType name="entriesType">
<xs:sequence>
<xs:element type="prov:entryType" name="entry" minOccurs="0" maxOccurs="10000" />
</xs:sequence>
</xs:complexType>
问题是maxOccurs="10000"
使用maxOccurs="1"
或maxOccurs="unbounded"
,速度非常快。
有人可以告诉我使用maxOccurs="10000"
的问题是什么?
答案 0 :(得分:4)
根据我的个人经验,让某些人认为“不合理”高值的粒子受到影响是导致性能问题的原因(this link来自我浏览器的最爱)。
潜在原因似乎是内存分配(由maxOccurs值指示的效果)。
此外,我还记得一个文档项,它说明了一个阈值,超出该阈值,对于所有意图和目的,解析器实际上将maxOccurs视为无限制,无论XSD说什么(如果我将重新访问此帖子)找到它。)