JavaのXML検証JDK 1.5 JDK 1.6の違い
-
20-09-2019 - |
質問
私は、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();
他のヒント
私は、これはあなたが常に任意の要素でXSI属性を置くことができるのJava 6のバグだと思います。
これは、このバグに非常に似ています、
http://bugs.sun.com/bugdatabase/view_bug.do ?bug_id = 6790700 の
修正6u14をお試しください。これは、最も可能性の高い、あまりにもあなたを修正します。
所属していません StackOverflow