проверка Java Java JDK 1,5 разница JDK 1,6 - PullRequest
1 голос
/ 28 августа 2009

У меня проблема с проверкой Java xml.

У меня есть следующий 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;
}

Тестовая программа имеет другое поведение в 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, чтобы они действовали в обоих?

Ответы [ 2 ]

1 голос
/ 28 августа 2009

Попробуйте добавить attributeFormDefault = "qualified" в вашем 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 голосов
/ 28 августа 2009

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

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

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

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

...