【问题标题】:java xml validation JDK 1.5 JDK 1.6 differencejava xml验证JDK 1.5 JDK 1.6的区别
【发布时间】:2009-08-28 11:24:37
【问题描述】:

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

测试程序在 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 在两者中都有效?

【问题讨论】:

    标签: java xml xsd xml-validation


    【解决方案1】:

    尝试将 attributeFormDefault="qualified" 放入您的 XSD。这应该没什么区别,但这是一个快速测试。

    另外:您没有将 DocumentBuilder 设置为可识别名称空间。这肯定会破坏验证,但它会破坏 1.5 和 1.6。

    作为一般评论,解析时的验证更有用,因为您可以看到验证失败的内容的行号。这是执行此操作的代码(schema 之前已创建):

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

    【讨论】:

      【解决方案2】:

      我会说这是 Java 6 中的一个错误。您总是可以将 xsi 属性放在任何元素中。

      和这个bug很相似,

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

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

      【讨论】:

      • 我使用的是 1.6.0_14。现在我已经升级到 1.6.0_16 但结果是一样的。
      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多