我正在尝试使用标准Java库验证XML文件并获得上述错误。我的XSD文件test1.xsd
是
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="foo">
<xsd:attribute name="bar" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
代码(在Eclipse中作为Junit测试运行):
@Test
public void testValidatingParser1() throws Exception {
String SCHEMA_PATH = "test1.xsd";
InputStream SCHEMA_STREAM = getClass().getResourceAsStream(SCHEMA_PATH);
StreamSource SCHEMA_SOURCE = new StreamSource(SCHEMA_STREAM);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(SCHEMA_SOURCE);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setSchema(schema);
}
错误是:
java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
at javax.xml.parsers.DocumentBuilderFactory.setSchema(Unknown Source)
at org.xmlcml.graphics.misc.SchemaTest.testValidatingParser1(SchemaTest.java:123)
这个错误似乎是由与XML解析器(例如Xerces)的不兼容性引起的,请参阅this post但我没有框架(除了Eclipse和Junit之外)。我的POM中没有明确的xerces。有一个简单的workround(我不介意我使用什么解析器,只要它验证)。
答案 0 :(得分:12)
我将其追溯到Xerces的不兼容版本,包含在其他软件中。强制Xerces的更高版本解决了这个问题。
答案 1 :(得分:1)
我认为您的XSD文件无法通过InputStream SCHEMA_STREAM = getClass().getResourceAsStream(SCHEMA_PATH);
访问。访问。
我只使用更改的行验证您的代码和XSD
文件,如下所示。它在JDK 1.6
和JDK 1.7
中没有任何问题。
InputStream SCHEMA_STREAM = new FileInputStream(new File(SCHEMA_PATH));
当文件无法访问时,我得到的NullPointerException
略有不同,如下所示:
Exception in thread "main" org.xml.sax.SAXParseException:
schema_reference.4: Failed to read schema document 'null'
答案 2 :(得分:0)
你在xsd中试过吗?
对于属性,请使用属性use="optional"
对于元素,请使用属性nillable="true"
或使用属性minOccurs="0"