我们做的有点奇怪。我们在.NET中使用Java Saxon,通过使用IKVM和所有其他Java代码对其进行编译。在命令行应用程序中,它工作得很好。
但在我们的Windows窗体应用程序中使用所有这些,我们可以:
org.xml.sax.SAXException occurred
HResult=-2146233088
Message (System.Exception)=SAX2 driver class com.sun.org.apache.xerces.internal.parsers.SAXParser not found
Message=SAX2 driver class com.sun.org.apache.xerces.internal.parsers.SAXParser not found
Source (System.Exception)=IKVM.OpenJDK.XML.API
Source=IKVM.OpenJDK.XML.API
StackTrace (System.Exception)= at org.xml.sax.helpers.XMLReaderFactory.loadClass(ClassLoader , String )
at org.xml.sax.helpers.XMLReaderFactory.createXMLReader()
at net.windward.datasource.xml.SaxonDataSource.ctor(InputStream xmlData, InputStream schemaFile, Boolean preserveWhiteSpace)
StackTrace:
at org.xml.sax.helpers.XMLReaderFactory.loadClass(ClassLoader , String )
at org.xml.sax.helpers.XMLReaderFactory.createXMLReader()
at net.windward.datasource.xml.SaxonDataSource.ctor(InputStream xmlData, InputStream schemaFile, Boolean preserveWhiteSpace)
InnerException:
显然,问题是com.sun.org.*在IKVM创建的DLL中找不到任何位置。对我来说奇怪的是命令行应用程序有效,而不是表单应用程序失败。
问题是,如何将com.sun.org.*包含在IKVM ed DLL中?
谢谢-戴夫
我怀疑com.sun.org.apache。xerces
存在于Oracle JDK中,但不存在于OpenJDK中。IKVM库基于OpenJDK。您可能应该使用JAXP机制(SAXParserFactory
或XMLReaderFactory
)来获取XML读取器
,而不是尝试加载特定的实现类。
后来
好的,从堆栈跟踪来看,您调用XMLReaderFactory.createXMLReader()来获取解析器。该方法的JDK 1.8版本似乎可以做到:
(a)获取系统属性< code>org.xml.sax.driver的值。
(b)查看元信息/服务
(c)使用类com.sun.org.apache.xerces.internal.parsers.SAXParser
我不知道该方法的IKVM版本是否相同:如果解析器实际上不在运行时中,保留com.sun.org回退会有点奇怪。但是有很多方法可以获得不同的XMLReader(包括直接实例化它,忽略工厂方法)。