gpt4 book ai didi

java - 使用 Java5 针对 XSD 进行验证时出现问题

转载 作者:行者123 更新时间:2023-11-30 07:39:20 24 4
gpt4 key购买 nike

我正在尝试使用 Java 5(JRE 1.5.0 更新 11)验证 Atom 提要。我的代码在 Java 6 中没有问题,但是在 Java 5 中运行时失败了

org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'xml:base' to a(n) 'attribute declaration' component.

我想我记得读过一些关于与 Java 5 捆绑在一起的 Xerces 版本的内容,该版本在某些模式方面存在一些问题,但我找不到解决方法。这是一个已知问题吗?我的代码有错误吗?

public static void validate() throws SAXException, IOException {
List<Source> schemas = new ArrayList<Source>();
schemas.add(new StreamSource(AtomValidator.class.getResourceAsStream("/atom.xsd")));
schemas.add(new StreamSource(AtomValidator.class.getResourceAsStream("/dc.xsd")));

// Lookup a factory for the W3C XML Schema language
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

// Compile the schemas.
Schema schema = factory.newSchema(schemas.toArray(new Source[schemas.size()]));
Validator validator = schema.newValidator();

// load the file to validate
Source source = new StreamSource(AtomValidator.class.getResourceAsStream("/sample-feed.xml"));

// check the document
validator.validate(source);
}

更新: 我尝试了下面的方法,但如果我使用 Xerces 2.9.0,我仍然遇到同样的问题。我还尝试将 xml.xsd 添加到模式列表中(因为 xml:base 在 xml.xsd 中定义)但是这次我有

Exception in thread "main" org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'null', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

更新 2: 我尝试使用 VM 参数配置代理 -Dhttp.proxyHost=<proxy.host.com> -Dhttp.proxyPort=8080现在它起作用了。我会尝试在家里发布“真实答案”。

抱歉,我不能作为评论回复:由于安全原因,XHR 已被禁用......

最佳答案

确实,人们一直在提到 Java 5 Sun 提供的 SchemaFactory 带来了麻烦。

那么:您自己在您的项目中包含了 Xerces 吗?

包含 Xerces 之后,您需要确保它正在被使用。如果您想对其进行硬编码(嗯,作为最低要求,您可能会使用一些应用程序属性文件来启用和填充以下代码):

String schemaFactoryProperty = 
"javax.xml.validation.SchemaFactory:" + XMLConstants.W3C_XML_SCHEMA_NS_URI;

System.setProperty(schemaFactoryProperty,
"org.apache.xerces.jaxp.validation.XMLSchemaFactory");

SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

或者,如果您不想硬编码,或者当您的麻烦代码位于某些您无法更改的第 3 方库中时,请在 java 命令行或环境选项中进行设置。例如(当然是一行):

set JAVA_OPTS = 
"-Djavax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema
=org.apache.xerces.jaxp.validation.XMLSchemaFactory"

顺便说一下:除了 Sun 包含的 SchemaFactory 实现会带来麻烦(类似于 com.sun.org.apache.xerces.internal.jaxp.validation.xs.schemaFactoryImpl),它似乎也非 JDK 实现的“发现”在该版本中失败。如果我理解正确的话,通常情况下,仅包含 Xerces 实际上会生成 SchemaFactory#newInstance。找到包含的库,并使其优先于 Sun 实现。据我所知,这在 Java 5 中也失败了,因此需要进行上述配置。

关于java - 使用 Java5 针对 XSD 进行验证时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/780811/

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