XML模式创建需要很长时间

时间:2013-10-23 14:33:49

标签: java xml xsd

我有以下代码:

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"的问题是什么?

1 个答案:

答案 0 :(得分:4)

根据我的个人经验,让某些人认为“不合理”高值的粒子受到影响是导致性能问题的原因(this link来自我浏览器的最爱)。

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

此外,我还记得一个文档项,它说明了一个阈值,超出该阈值,对于所有意图和目的,解析器实际上将maxOccurs视为无限制,无论XSD说什么(如果我将重新访问此帖子)找到它。)