gpt4 book ai didi

java - Xerces XMLSchemaFactory : Cannot find the declaration of element

转载 作者:行者123 更新时间:2023-11-30 09:50:39 27 4
gpt4 key购买 nike

我希望根据 XSD 文件验证 XML 文件(在 XML 文件中没有 namespace 和模式声明)。

XML 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<report> ... </report>

XSD 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="report">
...
</xs:element>
</xs:schema>

代码类似如下:

SchemaFactory xsdFac = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
xsdFac.setErrorHandler( ... );
Schema xsd = xsdFac.newSchema(xsdUrl); // xsdUrl works
Validator xsdValidator = xsd.newValidator();
xsdValidator.validate(new DOMSource(doc)); // doc is correct

我在这上面花了 3 个小时,因为它可以在我的 PC 上本地运行,过去它可以在服务器上运行(我认为),但现在它不能在服务器上运行。我试图找出我的 PC 和服务器之间的差异,但它们都使用相同的 JAR,等等。

无论如何,我已经确定了以下区别。我没有将类名传递给 SchemaFactory.newInstance 方法(几乎可以肯定是 mistake ),当我打印出 xsdFac 的类名时,我看到了它在本地和在服务器上是不同的。我不认为我想深入了解为什么会这样(我不知道),我认为最好找到一个可行的并明确指定它。

  • 在我的 PC 上(有效)它是 com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory。如果我在 newInstance 调用中明确指定它,那么它可以在 PC 和服务器上运行。
  • 在服务器上(不起作用),它是 org.apache.xerces.jaxp.validation.XMLSchemaFactory。如果我在 newInstance 调用中明确设置它,那么我在 PC 和服务器上都会遇到相同的错误。

请注意有效代码开头的 com.sun

所以至少我有一个解决方案,这很好。但是,我认为我不应该在我的代码中显式使用 com.sun 类吗?

其他信息:

  • 我得到的错误是:org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'report'
  • 这与我在工作版本中将元素名称更改为其他名称时遇到的错误相同,该名称在模式中不存在。所以我认为这只是意味着,“我了解您的架构,我了解 XML,并且您使用了一个未在架构中的任何位置声明的元素。”
  • xercesImpl-2.9.1.jar 在我的项目中(在服务器和 PC 上)。
  • 此 JAR 在非工作版本指定的包下包含一个 XMLSchemaFactory.class(即会让我相信它在那里,可找到,并且应该工作,毕竟我不获取与未找到的类相关的任何异常)
  • 我正在解析的 doc 对象在这两种情况下都是 org.apache.xerces.dom.DeferredDocumentImpl

所以,我的问题是:我想使用模式工厂的显式 Xerces 实现(我认为),因为我包含了 JAR 并且我有一个来自 Xerces 的文档对象,而且基本上我正在使用 Xerces validator (在 com.sun 的工作案例中)。

有没有人有过类似的经历?

最佳答案

我敢猜测,在失败的案例中,您实际上并没有在类路径上安装 Xerces。

-Djaxp.debug 会在您调用所调用的 JAXP APIS 时明确告诉您哪个实现处于 Activity 状态。

如果是这样,并且这不仅仅是类路径错误的结果,您确实可以专门“新建”Xerces 类,而不是调用 JAXP 通用工厂方法。我已经做到了。

编辑

评论表明这是一个网络应用程序。考虑到类加载规则,JAXP 类是放入 Web 应用程序中的痛苦之一。您至少应该尝试将它放入 tomcat 的“系统”类路径中,看看会发生什么。

关于java - Xerces XMLSchemaFactory : Cannot find the declaration of element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5052504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com