2009-08-28 42 views
1

我有一个Java xml验证的问题。java xml验证JDK 1.5 JDK 1.6的差异

我有以下的xsd:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="TEST"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="LAST_NAME"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:minLength value="1" /> 
       <xsd:maxLength value="30" /> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     <xsd:element name="FIRST_NAME"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:minLength value="1" /> 
       <xsd:maxLength value="20" /> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     <xsd:element name="DOB" nillable="true" type="xsd:date" /> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

和xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<TEST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <LAST_NAME>Lastname</LAST_NAME> 
    <FIRST_NAME>Firstname</FIRST_NAME> 
    <DOB xsi:nil="true"/> 
</TEST> 

我的验证的(简化)代码:

boolean valid=true; 
try { 
    Source schemaSource = new StreamSource(xsdInputStream); 
    DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
    Document document = parser.parse(xmlInputStream); 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

    Schema schema = factory.newSchema(schemaSource); 

    Validator validator = schema.newValidator(); 
    try { 
     validator.validate(new DOMSource(document)); 
    } catch (SAXException e) { 
     logger.log(Level.INFO, e.getMessage(), e); 
     valid = false; 
    } 

} catch(Exception ex) { 
    logger.log(Level.SEVERE, ex.getMessage(), ex); 
    valid=false; 
} 

的testprogram有不同的行为JDK 1.5和JDK 1.6。 xml在JDK 1.5中有效,但在JDK 1.6中无效。错误消息如下:

Element 'DOB' is a simple type, so it cannot have attributes, excepting those whose namespace name is identical to 'http://www.w3.org/2001/XMLSchema-instance' and whose [local name] is one of 'type', 'nil', 'schemaLocation' or 'noNamespaceSchemaLocation'. However, the attribute, 'xsi:nil' was found. 

哪个JDK是正确的?如何更改xml/xsd在两者中都有效?

回答

1

尝试在您的XSD中放置attributeFormDefault =“qualified”。这不应该有所作为,但这是一个快速测试。

另外:您不要将DocumentBuilder设置为名称空间感知。这肯定会打破验证,但它会打破1.5和1.6。

作为一般性评论,解析时的验证更有用,因为您可以看到未通过验证的内容的行号。下面的代码做(schema是先前创建的):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setValidating(false); 
dbf.setSchema(schema); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
+0

thx。 setNamespaceAware(true)解决了我的问题。 – asalamon74 2009-08-28 19:08:50

0

我会说这是Java 6中的错误,您可以始终把任何元素XSI属性。

这是非常相似的这个bug,

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6790700

尝试修复6u14。它很可能会解决你的问题。

+0

我正在使用1.6.0_14。现在我已经升级到1.6.0_16,但结果是一样的。 – asalamon74 2009-08-28 13:36:38