org.xml.sax.SAXParseException: cvc-elt.1: не удается найти объявление элемента 'server' - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь выяснить проблему с генерацией XML-файла, который в настоящее время не может быть проанализирован - но только когда он генерируется с использованием IBM Java 8. Он может быть проанализирован при генерации с Redhat Java 8. Разницамежду ними есть то, что реализация RedHat имеет перевод строки после объявления xml и после каждого объявления пространства имен, в то время как реализация IBM - нет.

Вот заголовок, который работает (генерируется с помощью Redhat Java):

<?xml version="1.0" encoding="UTF-8"?>
<server id="myServer" max-logins="100"
    xmlns="http://mina.apache.org/ftpserver/spring/v1"
   xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd">
   <listeners>
      <nio-listener name="default" port="21">

Как видите, после объявления xml вверху есть перевод строки плюс каждый атрибут xmlns всерверный тег.

Вот заголовок, сгенерированный из того же кода с использованием IBM Java 8:

<?xml version="1.0" encoding="UTF-8"?><server id="myServer" max-logins="100" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd">
   <listeners>
      <nio-listener name="default" port="21">

В этом случае нет перевода строки до первого дочернего тега (слушателей).

К сожалению, эта вторая ситуация вызывает исключение в синтаксическом анализаторе Sax, который использует Spring.

Вот трассировка стека:

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 1 in XML document from file [C:\xxxx\image-server\.\res\conf\temp.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'server'.
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
        at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113)
        at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:80)
        at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
        at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:423)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:353)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140)
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84)
        at org.apache.ftpserver.main.CommandLine.getConfiguration(CommandLine.java:164)

Фактический файл, генерирующий XML, - org.w3c.dom.DOMConfiguration.Я думаю, что это включено в rt.jar, но не подтвердили это.

Есть идеи, как обойти это?Я мог бы вручную вставить перевод строки в файл, но я не совсем уверен, что это простое и не лучшее решение.

Обновление: загрузчик классов IBM говорит, что он пришел из Java:

class load: org/w3c/dom/DOMConfiguration from: C:\javaInstalls\ibm_sdk80\jre\lib\xml.jar

Интересно, есть ли способ использовать собственный загрузчик классов для загрузки класса org.w3c из другого jar?

...