2009-08-28 18 views
1

Java XML検証に問題があります。java xml検証JDK 1.5 JDK 1.6の相違

<?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::

私は、次のXSDを持って

<?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.6と同様に1.5を下回るだろう。

一般的なコメントとして、検証に失敗したコンテンツの行番号がわかるため、解析時の検証がより便利です。ここではそれを行うためのコードは、(schemaが以前に作成されます)です。

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

thx。 setNamespaceAware(true)は私の問題を解決しました。 – asalamon74

0

私は、これはあなたが常に任意の要素でXSI属性を置くことができるのJava 6のバグであると言うでしょう。

それは

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

フィックス6u14を試してみて、このバグに非常に似ています。おそらくあなたのことも修正するでしょう。

+0

私は1.6.0_14を使用していました。今は1.6.0_16にアップグレードしましたが、結果は同じです。 – asalamon74

関連する問題