Проверка больших файлов XML на большие XSD, есть ли быстрый способ сделать это?

Я пытаюсь быстро проверить большие документы XML против больших XSD. XML может быть длиной от 500 до 39000 строк, а XSD – в диапазоне 2000-3000 строк.

Результат до сих пор был ужасно низкой производительностью, инициализация синтаксического анализатора с такими большими XSD может занять до 30 секунд, однако это прекрасно, поскольку мы можем сделать это один раз, а затем просто ввести его.

Но, когда дело доходит до фактического использования этого для проверки XML, в зависимости от реализации это может занять от 30 секунд до 2 минут.

Это действительно странно, как инструмент командной строки, называемый xmllint: xmllint --schema test.xsd valid.xml и ту же работу, но заканчивается мгновенно.

Я пробовал библиотеку JDOM, метод SAXReader, и я поселился в jdom2, вот как я его строю:

 URL xsd = Resources.getResource("test-xml/test.xsd"); XMLReaderJDOMFactory factory = new XMLReaderXSDFactory(xsd); builder = new SAXBuilder(factory); 

И вот разбор в действии:

 InputStream stream = new ByteArrayInputStream(inputXml.getBytes()); Document document = builder.build(stream); 

Компонент builder.build – это линия, которая должна быть граничной.

Что касается желаемого решения, я не возражаю против использования C, Kotlin, независимо от того, насколько выходной разумно читать и быстро.

благодаря

Таким образом, ответ пришел к тому, что было на самом деле внутри XSD, в частности значение maxOccurs. В какой-то момент maxOccurs были настроены на 4999, что вызывает ошибку, указанную здесь: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6483188

Если фактическое количество maxOccurs не относится к вам, вы можете изменить значение maxOccurs на «неограниченное». Или вы можете снизить значения maxOccurs, на моей машине значение maxOccurs 1000 дало результат около 1 секунды для анализа значений, а затем 99 около 300 мс. С неограниченным, также находящимся в 300 мс.

Это значительно ниже, чем за 50 секунд, чтобы проанализировать значение maxOccurs, равное 4999