使用 dom4j DOMDocument 提供 validator.validate(DOMSource) 在 java 1.6 中失败(不允许 xsi:noNamespaceSchemaLocation),在 1.5 中有效

2024-04-21

使用 dom4j DOMDocument 提供 validator.validate(DOMSource) 在 java 1.6 中失败(不允许 xsi:noNamespaceSchemaLocation 出现在根元素中),在 1.5 中有效

我发现以下问题非常棘手(好吧,这是轻描淡写) - 任何见解将不胜感激。目前看来最好的想法是放弃 dom4j,转而使用例如XOM(http://stackoverflow.com/questions/831865/what-java-xml-library-do-you-recommend-to-replace-dom4j)。

我一直在内存中验证从 dom4j 'new DOMDocument()' 创建的 XML - 但这不适用于 Java 6。

以下对 dom4j (1.6.1) DOMDocument 派生的 DOMSource 的 validate(source) 的调用适用于 Java 1.5.x,但适用于 Java 1.6.x:

public void validate() throws Exception {
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    schemaFactory.setErrorHandler(null);
    Schema schemaXSD = schemaFactory.newSchema(new URL(getSchemaURLString()));
    Validator validator = schemaXSD.newValidator();
    DOMSource source = new DOMSource(getDocument());
    validator.validate(source);
}

getSchemaURLString() 还用于向根节点添加 xsi:noNamespaceSchemaLocation 属性,即: xsi:noNamespaceSchemaLocation="http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd"

例外情况如下:

Exception:  org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in element 'specialfields'.;                
complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in element 'specialfields'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:417)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3182)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processAttributes(XMLSchemaValidator.java:2659)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:2066)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:705)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.beginNode(DOMValidatorHelper.java:273)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:240)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:186)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:104)
at javax.xml.validation.Validator.validate(Validator.java:127)

以下是禁用对 validator.validate(source) 的调用后生成的 XML 的开头:

<?xml version="1.0" encoding="utf-8"?> 
<meetings xsi:noNamespaceSchemaLocation="http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
.............
</meetings>

以及 XSD:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="meetings">
    <xs:complexType>
      <xs:choice>
    <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" ref="summary" />
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="meeting" />
        </xs:sequence>
        <xs:element ref="error" />
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:element name="summary">
................

因此,我的根元素被拒绝,因为它包含 xsi:noNamespaceSchemaLocation 属性。并且架构本身没有将其指定为我的根元素的有效属性?

此时,在我看来,我需要放弃 dom4j 来完成此任务,并切换到其他解决方案之一,例如此处概述的:

但无论如何,我想知道我做错了什么!

提前致谢。


我遇到了同样的问题,我在以下位置找到了以下文档

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html

根据文档指定的模式进行验证

一些文档指定了他们希望验证的模式, 通常使用 xsi:noNamespaceSchemaLocation 和/或 xsi:schemaLocation 属性如下:

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">  
 ...

如果您创建架构时未指定 URL、文件或源,则 Java 语言创建一个在文档中查找的语言 进行验证以找到它应该使用的模式。例如:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 
Schema schema = factory.newSchema();

但是,通常这不是您想要的。通常是文档 消费者应该选择模式,而不是文档生产者。 此外,此方法仅适用于 XSD。所有其他架构 语言需要显式指定的架构位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 dom4j DOMDocument 提供 validator.validate(DOMSource) 在 java 1.6 中失败(不允许 xsi:noNamespaceSchemaLocation),在 1.5 中有效 的相关文章

  • 关于在序列中的 xsi:type 上使用 xs:unique

    元素的类型可以有唯一的约束吗 假设我有一艘诺亚方舟 其中 Animal name 必须是唯一的 下面是一个未根据架构进行验证的 XML
  • 使用 JAXB 获取布尔属性的 getter

    我正在尝试使用 jax ws 公开服务 但我得到的第一个惊喜是 Weblogic 不支持请求 响应对象的内部类 克服这种情况后here https stackoverflow com questions 144118 jaxb bindin
  • 使用 XmlSerializer 和 WCF SOAP 添加根 xmlns

    我有一个由客户从第三方提供的 XML 架构文档生成的类文件 我应该能够将这个生成的类用于客户的 SOAP Web 服务 但我遇到了一些问题 我创建了一个ServiceContract接口 这样我就可以使用 WCFChannelFactory
  • 如何解决错误:SOAP-ERROR:编码:对象没有“createLead”属性?

    我编写了一个应该连接到安全 Web 服务 ws security 的脚本 但是 运行脚本时 我收到此错误 Error SOAP ERROR Encoding object has no createLead property 我正在使用这段
  • 从 XSD 生成 Ruby 类

    有没有办法从 XSD 生成 Ruby 类 甚至可能是 ActiveResource 类 以便它们包含将类序列化为对初始 XSD 有效的 xml 的方法 我知道soap4r有xsd2ruby 但似乎生成的ruby类无法轻松序列化为xml 无耻
  • 使用 XSD 进行 XML 验证时出现无效子元素错误,我不知道为什么?

    使用以下内容我总是收到无效子元素错误 我是 XML 的新手 我一直在网上寻找并尝试解决这个问题 但没有运气 我有另一个 XSD 正在验证提交到我的应用程序的 XML 它工作得很好 但它使用的是属性而不是元素 无法使用 XSD 中的元素来验证
  • 单遍读取和验证 XML 与 C# 中引用的 XSD

    我正在尝试从 XML 文件中读取数据 并根据它建议的 XSD 对其进行验证 将其转换为单个数据结构 例如 XmlDocument 我有一个解决方案 但它需要两次通过文件 我想知道是否有单次解决方案 MyBooks xml
  • 在 C# 中根据嵌入的 XSD 验证 XML

    我使用以下 MSDN 文档根据架构验证 XML 文件 http msdn microsoft com en us library 8f0h7att 28v vs 100 29 aspx http msdn microsoft com en
  • 计算与 xsd 中的正则表达式匹配的字符串的最大可能长度 (C#)

    我正在使用 XSD 并且可以以字符串形式从 XSD 访问模式 一个例子
  • 使用 Cp500 编码陌生事物(LF 和 NEL)

    最近 在从字节转换为字符串 然后再从字符串转换为字节的过程中 我遇到了 Cp500 EBCDIC 编码的奇怪问题 问题在于一个特定的角色就是在这个转变过程中 被转变为这个角色 下面的代码验证了这一点 byte b25 0x25 byte b
  • 如何在 Java 中有效使用 SAXParseException

    我正在 Java 中针对 XML 架构进行验证 并且当我有无效的内容模型时抛出 SAXParseException 我将使用这些异常来突出显示验证失败的位置 但 SAXParseExceptions 似乎有点太低级了 例如 对于枚举失败 我
  • 根据 XSD 验证 XML 时忽略元素顺序

    我们有一个 XML 需要根据 XSD 进行验证 XML 由 XSTREAM 生成 我们正在使用 jaxp api 根据相应的 XSD 验证 XML 不幸的是 目前我们的测试用例失败 因为生成的 XML 的元素 标签的顺序 顺序与 XSD 不
  • java 6 IO - 包装流关闭[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 针对 xsd 的 xml 模式转换问题在 Android 应用程序中给出非法异常

    我已经编写了一段代码来根据我的 android 应用程序中给定的 xsd 文件验证给定的 xml 文件 但它给出了非法异常错误 在一些帖子中我看到它是因为 java 版本较低 但我的java版本是1 6 0 20 请检查下面的代码 错误日志
  • XSD 中的 xmlns:mstns 是什么?

    下面的xsd header中的xml mstns表示什么
  • Spring中需要多个相同类型的bean

    将其标记为重复之前的请求 我浏览了论坛 但在任何地方都找不到该问题的解决方案 我正在使用 Spring 3 2 编写代码 一切都是纯粹基于注释的 该代码接收从不同 XSD 文件派生的 XML 文件 所以我们可以说 有五个不同的 XSD A1
  • 使用 python 从 XSD 文件创建特定的 XML 文件

    我有一个现有的 xsd 架构 并且需要创建 希望使用 Python 带有一些特定输入的 XML 文件 最好的方法是什么 我尝试了 Element Tree 和 xmlschema 但我无法判断它们是否允许从已知的 XSD 架构开始生成 XM
  • 了解 JAXB @XmlRootElement 注释

    我正在使用教程在这里 http www vogella com articles JAXB article html jaxb用于理解 JAXB 当作者开始创建文档的根时 作者开始如下 This statement means that c
  • RESTful API 应该有架构吗?

    最近有人告诉我 一个合适的 RESTful API 应该为其接受和返回的资源表示定义一个模式 例如 用于 XML 的 XSD 和用于 JSON 的 JSON 架构 然而 在我读过的所有关于 REST 的书籍和文章中 这一点似乎不仅没有突出
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目

随机推荐