6

我正在尝试使用标准 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)不兼容造成的,请参阅这篇文章,但我没有框架(Eclipse 和 Junit 除外)。我的 POM 中没有明确的 xerces。是否有一个简单的解决方法(我不介意我使用什么解析器,只要它验证)。

4

3 回答 3

12

我将其追踪到不兼容的 Xerces 版本,包含在其他软件中。强制使用更高版本的 Xerces 可以解决问题。

于 2012-10-23T04:36:37.823 回答
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'
于 2012-10-21T03:30:07.430 回答
0

你在xsd中试过吗?

对于属性,使用属性use="optional"

对于元素使用属性nillable="true"或使用属性minOccurs="0"

XML Schema 中 null 的表示

于 2012-10-21T05:26:39.470 回答