문제

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;
}

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를 둘 다 유효하도록 변경하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

XSD에 AttributeFormDefault = "자격이있는"을 넣으십시오. 그것은 차이를 만들지 않아야하지만 빠른 테스트입니다.

또한 : DocumentBuilder를 네임 스페이스 인식으로 설정하지 않습니다. 그것은 확실히 검증을 중단 할 것이지만 1.5와 1.6 미만이 될 것입니다.

일반적인 의견으로, 파싱 당시의 검증이 더 유용합니다. 다음은이를 수행하는 코드입니다 (schema 이전에 만들어졌습니다) :

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

다른 팁

나는 이것이 Java 6의 버그라고 말할 것입니다. 당신은 언제든지 XSI 속성을 어떤 요소에도 넣을 수 있습니다.

이 버그와 매우 유사합니다.

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

수정 6U14를 사용해보십시오. 아마도 당신도 고칠 가능성이 높습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top