4

我有以下代码:

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);
    }
  }

对我的 XSD 文件执行该行似乎schemaFactory.newSchema(streamSources);需要很长时间(30 秒)。

在对这个 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"or maxOccurs="unbounded",速度非常快。

有人可以告诉我使用有什么问题maxOccurs="10000"吗?

4

1 回答 1

4

根据我的个人经验,将粒子限制在某些人可能认为“不合理”的高值会导致性能问题(此链接来自我的浏览器的收藏夹)。

根本原因似乎是内存分配(由 maxOccurs 值指示的效果)。

另外,我记得一个文档项目,它声明了一个阈值,无论 XSD 说什么,解析器实际上都会将 maxOccurs 视为无界的阈值(如果我找到它,我会重温这篇文章) .

于 2013-10-26T13:54:47.793 回答