我正在尝试找出当前无法解析的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">
在这种情况下,直到第一个子标记(侦听器)都没有换行符。
不幸的是,第二种情况导致Spring使用的Sax解析器发生异常。
这是堆栈跟踪:
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
我想知道是否有一种方法可以使用自定义类加载器从另一个jar中加载org.w3c类?