java xml验证JDK 1.5 JDK 1.6差异
我对Java xml验证有一个问题 我有以下xsd:java xml验证JDK 1.5 JDK 1.6差异,java,xml,xsd,xml-validation,Java,Xml,Xsd,Xml Validation,我对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:sequenc
<?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>
testprogram在JDK1.5和JDK1.6中有不同的行为。xml在JDK1.5中有效,但在JDK1.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更改为在两者中都有效?尝试将attributeFormDefault=“qualified”放入xsd中。这应该没什么区别,但这是一个快速的测试 另外:您没有将DocumentBuilder设置为具有名称空间意识。这肯定会破坏验证,但它会在1.5和1.6下被破坏 一般来说,解析时的验证更有用,因为您可以看到验证失败的内容的行号。下面是执行此操作的代码(
schema
是以前创建的):
尝试将attributeFormDefault=“qualified”放入XSD中。这应该没什么区别,但这是一个快速的测试 另外:您没有将DocumentBuilder设置为具有名称空间意识。这肯定会破坏验证,但它会在1.5和1.6下被破坏 一般来说,解析时的验证更有用,因为您可以看到验证失败的内容的行号。下面是执行此操作的代码(
schema
是以前创建的):
我认为这是Java6中的一个bug。您始终可以在任何元素中放置xsi属性 它与这个bug非常相似
尝试修复6u14。它很可能也会修复您的错误。我认为这是Java 6中的一个错误。您始终可以在任何元素中放置xsi属性 它与这个bug非常相似
尝试修复6u14。它很可能也会修复您的问题。我使用的是1.6.0_14。现在我已经升级到1.6.0_16,但结果是一样的。我使用的是1.6.0_14。现在我已经升级到1.6.0_16,但结果是一样的。
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;
}
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.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);
dbf.setSchema(schema);
DocumentBuilder db = dbf.newDocumentBuilder();