首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当架构来自类路径时,Java XML验证不起作用

当架构来自类路径时,Java XML验证不起作用
EN

Stack Overflow用户
提问于 2012-06-12 13:14:20
回答 3查看 6.9K关注 0票数 7

我正在根据模式验证XML文档。一些更复杂的文档/模式在尝试使用以下代码进行验证时总是会失败:

代码语言:javascript
运行
AI代码解释
复制
    DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
    dbfac.setNamespaceAware(true);
    dbfac.setIgnoringElementContentWhitespace(true);
    DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
    Document doc = docBuilder.parse("sampleResponse.xml");

    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Source schemaSource = new StreamSource(getClass().getResourceAsStream("/" + "SampleResponse.xsd"));

    Schema schema = schemaFactory.newSchema(schemaSource);
    Validator validator = schema.newValidator();
    Source source = new DOMSource(doc);
    // Set a custom error handler that simple re-throws every exception
    validator.setErrorHandler(new ValidationErrorHandler());
    validator.validate(source);

问题是这一行:

代码语言:javascript
运行
AI代码解释
复制
    Source schemaSource = new StreamSource(getClass().getResourceAsStream("/" + "SampleResponse.xsd"));

如果我将模式作为一个文件读取,它可以工作:

代码语言:javascript
运行
AI代码解释
复制
    Source schemaSource = new StreamSource(new File("somepath/SampleResponse.xsd"));

当我直接从类路径获取模式时,为什么验证不起作用?

(在64位Windows 7上使用Java 1.6 )

失败时的异常信息:Could not validate against schema SampleResponse.xsd. Nested exception: src-resolve: Cannot resolve the name 'oa:Attachments' to a(n) 'element declaration' component.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-12 13:41:49

当您将文件传递给StreamSource时,InputStream被设置为文件的内容,但systemId也被设置为文件的URL。这允许解析模式中的相对URI。如果您的模式有任何相对URL,这肯定是您的问题。要使这些相对URL在从类路径读取模式时可解析,您需要实现一个EntityResolver。如果您不使用相对URI,那么systemId为空可能还有其他更微妙的影响。我推荐使用构造函数

代码语言:javascript
运行
AI代码解释
复制
StreamSource(InputStream inputStream, String systemId)

尝试将systemId设置为: null、包含架构的文件、其他文件、不存在的文件。这可能会让您对Validator正在对systemId做些什么有所了解。

票数 9
EN

Stack Overflow用户

发布于 2018-05-24 22:22:48

我发现我不需要实现EntityResolver来使相对URL可以从类路径解析。

将系统id设置为类路径资源的URI就足够了。

下面是一个使用Spring从类路径上的.xsd文件构建_StreamSource_s列表的工作示例。

设置验证源

代码语言:javascript
运行
AI代码解释
复制
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;

PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
Resource[] theResources = patternResolver.getResources("classpath:schemas/**/*.xsd");
List<Source> sources = new ArrayList<>();
for (Resource resource: theResources) {
    StreamSource dtd = new StreamSource(resource.getInputStream());
    dtd.setSystemId(resource.getURI().toString());
    sources.add(dtd);

patternResolver被赋予了一个classpath:schemas/**/*.xsd模式,允许它递归地查找类路径上schemas目录中的所有.xsd文件。

.xsd文件可以使用相对路径导入其他.xsd文件。例如,.xsd文件可能包含如下导入:

代码语言:javascript
运行
AI代码解释
复制
<xsd:import namespace="urn:www.example.com/common" schemaLocation="./common.xsd">

这一行:

代码语言:javascript
运行
AI代码解释
复制
dtd.setSystemId(resource.getURI().toString());

是让模式验证器解析.xsd文件中的相对路径的关键。

执行验证

现在可以使用上面构建的XML数组(源)来设置StreamSource验证的模式源:

代码语言:javascript
运行
AI代码解释
复制
import org.xmlunit.builder.Input;
import org.xmlunit.validation.Languages;
import org.xmlunit.validation.Validator;
import javax.xml.transform.Source;

Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
v.setSchemaSources(sources.toArray(new Source[sources.size()]));
Source input = Input.fromByteArray(xmlBytes).build();
v.validateInstance(input);

validateInstance方法调用验证由xmlBytes数组表示的XML。

票数 2
EN

Stack Overflow用户

发布于 2020-10-14 13:01:26

对于后人,这里是我在Scala中做的一些事情,灵感来自Joman68的答案https://stackoverflow.com/a/50518995/434405,它不使用spring库。

代码语言:javascript
运行
AI代码解释
复制
import javax.xml.XMLConstants
import javax.xml.transform.Source
import javax.xml.transform.stream.StreamSource
import javax.xml.validation.{Schema, SchemaFactory, Validator}

object SchemaCheck extends App {

  private val xsds = List("schema.xsd") // add more as required

  private val schemaDocuments: Array[Source] = xsds.map { xsd =>
    val res = getClass.getResource(s"/$xsd")
    val dtd = new StreamSource(res.toURI.toString)
    dtd.setSystemId(res.toURI.toString)
    dtd
  }.toArray

  private val sf           = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
  private val s: Schema    = sf.newSchema(schemaDocuments)
  private val v: Validator = s.newValidator()

  private val instanceDocument: Source = new StreamSource(new java.io.File("test.xml"))
  v.validate(instanceDocument)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10997453

复制
相关文章
从类生成XML架构
要生成为同一XML命名空间中的多个类定义类型的完整架构,请使用%XML.Schema构建架构,然后使用%XML.Writer为其生成输出。
用户7741497
2022/07/05
1.1K0
从XML架构生成类
Studio提供了一个向导,该向导读取XML模式(从文件或URL),并生成一组支持XML的类,这些类对应于模式中定义的类型。 所有的类都扩展%XML.Adaptor。 指定一个包来包含类,以及控制类定义细节的各种选项。
用户7741497
2022/07/05
1.7K0
Java XML解析工具类
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162472.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/16
1.3K0
java解析xml工具类[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143972.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
1.4K0
java json转xml 工具类_xml与json
首先要去官方下载json-lib工具包 https://mvnrepository.com/artifact/net.sf.json-lib/json-lib/2.4
全栈程序员站长
2022/10/04
1.7K0
java json转xml 工具类_xml与json
Java xml转Json工具类
看了下CSDN博客,关于工具类的大多为下载需要C币,本工具类xml转成json的大部分xml格式都适用。
疯狂的KK
2020/02/26
3K0
XML格式化工具类(java)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160163.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/13
1.7K0
使用Java类代替web-xml
在 servlet3.0 当中支持使用 Java 的类来配置启动容器,使用方法如下面的 Java 代码所示,可以作为模板使用:
小小杰啊
2022/12/21
3400
当Java遇到XML 的邂逅+dom4j
XML简介: XML:可扩展标记语言!   01.很象html   02.着重点是数据的保存   03.无需预编译   04.符合W3C标准 可扩展:我们可以自定义,完全按照自己的规则来! 标记: 计
房上的猫
2018/07/04
9500
java获取服务器路径和类加载路径
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157275.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/15
1.7K0
java验证码图片工具类_工具类:VerifyCode.java:图片验证码
[JavaWeb工具类目录](http://baike.xsoftlab.net/view/1059.html) [http://baike.xsoftlab.net/view/1059.html](http://baike.xsoftlab.net/view/1059.html)
全栈程序员站长
2022/09/14
1K0
java工具类——验证码(VerifyCode)[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159571.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
2K0
【java】java反射初探 ——“当类也学会照镜子”
该文章介绍了Java中的反射机制,包括Class、Method、Field、Constructor等类的概述、使用方式以及示例。
啦啦啦321
2018/01/03
8390
【java】java反射初探 ——“当类也学会照镜子”
使用xmllint处理/验证xml
xmllint是一个很方便的处理及验证xml的工具,linux下只要安装libxml2就可以使用这个命令,下面整理一些常用功能
跑马溜溜的球
2020/12/07
1.7K0
XML封装与验证消息
Document document = DocumentHelper.createDocument(); document.setXMLEncoding(ChARSET_UTF_8); Element root = document.addElement("message"); Element head = root.addElement("head"); head.addElement("field").addAttribute("name"," ").setText(""); Element bo
用户3003813
2018/09/06
6280
在类路径或引导类路径中找不到程序包 java.lang
正确配置如下:Windows(分隔符英文分号):XML/HTML code bootclasspath ${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</ bootclasspath linux(分隔符英文冒号):XML/HTML code bootclasspath ${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</ bootclasspath
Raindew
2018/06/14
3.9K0
IL3000:当发布为单个文件时,避免访问程序集文件路径
发布为单文件(例如将项目中的 PublishSingleFile 属性设置为 true)时,调用嵌入在单文件捆绑包内的程序集的 Assembly.Location 属性将始终返回空字符串。
呆呆
2022/02/26
5170
当AI泡沫破裂时……
很显然我们目前处于一个不稳定的状态。这到底是一场泡沫还是一次革命?答案是当然包含一点革命——深度神经架构所创造的实实在在的成功已经颠覆了视觉和语音识别领域,更通用的机器学习也已经有了大量真实世界用例。
刀刀老高
2018/07/24
3600
当AI泡沫破裂时……
很显然我们目前处于一个不稳定的状态。这到底是一场泡沫还是一次革命?答案是当然包含一点革命——深度神经架构所创造的实实在在的成功已经颠覆了视觉和语音识别领域,更通用的机器学习也已经有了大量真实世界用例。
机器之心
2018/07/26
3790
IL3001:当发布为单个文件时,避免访问程序集文件路径
发布为单文件(例如,通过将项目中的 PublishSingleFile 属性设置为 true)时,为单文件捆绑包内嵌入的程序集调用 Assembly.GetFile(s) 方法将始终引发异常,因为这些方法与单文件不兼容。
呆呆
2022/02/26
4960

相似问题

验证xml架构时出错

21

Java XML架构验证:前缀未绑定

20

用于验证XML架构的XML架构?

31

XML架构验证

22

架构验证XML

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文