首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java xml验证JDK 1.5 JDK 1.6差异

java xml验证JDK 1.5 JDK 1.6差异
EN

Stack Overflow用户
提问于 2009-08-28 11:24:37
回答 2查看 4.2K关注 0票数 1

我有一个关于Java xml验证的问题。

我有以下xsd:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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>

我的验证器的(简化)代码:

代码语言:javascript
复制
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中无效。错误消息如下:

代码语言:javascript
复制
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更改为在两者中都有效?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-28 11:29:47

尝试将attributeFormDefault="qualified“放入您的XSD中。这应该不会有什么不同,但这是一个快速测试。

另外:您没有将您的DocumentBuilder设置为名称空间感知。这肯定会破坏验证,但它会低于1.5和1.6。

一般来说,解析时的验证更有用,因为您可以看到未通过验证的内容的行号。下面是执行此操作的代码(schema是在前面创建的):

代码语言:javascript
复制
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);
dbf.setSchema(schema);
DocumentBuilder db = dbf.newDocumentBuilder();
票数 1
EN

Stack Overflow用户

发布于 2009-08-28 11:37:04

我想说这是Java6中的一个bug。你总是可以把xsi属性放在任何元素中。

它与这个bug非常相似,

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

尝试修复6u14。它很可能也会解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1346414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档