2009-08-28 2 views
1

У меня проблема с проверкой Java xml.java xml validation 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> 

The (упрощенный) код моего валидатора:

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

Попробуйте положить атрибутFormDefault = «квалифицированный» в ваш XSD. Это не должно меняться, но это быстрый тест.

Также: вы не устанавливаете 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

0

Я бы сказал, что это ошибка в Java 6. Вы всегда можете поместить XSI атрибуты любого элемента.

Это очень похоже на эту ошибку,

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

Попробуйте исправить 6u14. Скорее всего, это исправит и вас.

+0

Я использовал 1.6.0_14. Теперь я обновился до 1.6.0_16, но результат тот же. – asalamon74

Смежные вопросы