- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试验证包含多个 XSD 的 XML,验证正常,但事实不应该如此。
例如,我的 XML 是
<cnt:FirstXsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cat="CommonTypes"
xmlns:cnt="FirstXsd"
xmlns:env="http://www.w3.org/2001/06/soap-envelope"
xsi:schemaLocation="FirstXsd FirstXsd.xsd">
<cat:DocumentID>TEST_TEXT</cat:DocumentID>
<cnt:FirstDoc>
<cnt:DocBody>
<sec:SecondXsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cat="CommonTypes"
xmlns:sec="SecondXsd"
xsi:schemaLocation="SecondXsd Second.xsd">
<cat:DocumentID>TEST_NUMBER</cat:DocumentID>
</sec:SecondXsd>
</cnt:DocBody>
</cnt:FirstDoc>
</cnt:FirstXsd>
和<cat:DocumentID>TEST_NUMBER</cat:DocumentID>
为必填项
我检查了该代码
public class Main {
public static void main(String[] args) {
File xsds=new File[]{new File(this.getClass().getClassLoader().getResource("First.xsd").getFile()),new File(this.getClass().getClassLoader().getResource("Second.xsd").getFile())};
File xml = new File(this.getClass().getClassLoader().getResource("test.xml").getFile());
System.out.println(validation.validateXMLByXSD_Array(new StreamSource(new StringReader(xml)),xsds));
}
public boolean validateXMLByXSD_Array(Source xml, File[] xsds) {
Source[] sources = new Source[xsds.length];
for (int i = 0; i < xsds.length; i++) {
sources[i] = new StreamSource(xsds[i]);
}
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(sources);
Validator validator = schema.newValidator();
validator.setErrorHandler(new ForgivingErrorHandler());
validator.validate(xml);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
所以,我的问题是,如果我删除必需的<cat:DocumentID>
,每次我都不会收到任何错误或不。但是,如果我删除完整的 <cnt:DocBody>
这是 First.xsd 所必需的,我收到错误。
看来,只有 XML 中 JVM 中出现的第一个 XSD 正在检查。当我尝试调试时,我看到我的架构里面有两个 xsd,就像写的 here 一样。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:cat="CommonTypes:1.0" xmlns:cnt="FirstXsd:1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="FirstXsd:1.0" elementFormDefault="qualified" version="1.0">
<xs:import namespace="CommonTypes:1.0" schemaLocation="CommonTypes.xsd"/>
<xs:element name="FirstXsd" type="cnt:FirstXsdType"/>
<xs:complexType name="FirstXsdType">
<xs:complexContent>
<xs:extension base="cat:BaseDocType">
<xs:attribute name="DocumentModeID" type="cat:DocumentModeIDType" use="required" fixed="TEST_TEXT"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ContainerDocType">
<xs:sequence>
<xs:element name="Element1" type="cat:Element1" minOccurs="0"/>
<xs:element name="Element2" type="cat:Element2" minOccurs="0"/>
<xs:element name="Element3" type="cat:Element3" minOccurs="0"/>
<xs:element name="DocBody" type="cat:DocBodyType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DocBodyType">
<xs:sequence>
<xs:any processContents="skip"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cat="CommonTypes:1.0" xmlns:sec="SecondXsd:1.0" targetNamespace="SecondXsd:1.0" elementFormDefault="qualified" version="1.0">
<xs:import namespace="CommonTypes:1.0" schemaLocation="CommonTypes.xsd"/>
<xs:element name="SecondXsd" type="sec:SecondXsdType"/>
<xs:complexType name="SecondXsdType">
<xs:complexContent>
<xs:extension base="cat:BaseDocType">
<xs:sequence>
<xs:element name="Element1" type="cat:Element1"/>
<xs:element name="Element2" type="cat:Element2"/>
<xs:element name="Element3" type="cat:Element3" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
最佳答案
感谢您提供 xsd。查看 CommonTypes.xsd 的定义也会很有用。不过,我想我可以根据您发布的内容提出有用的评论。
您声称 cat:DocumentID 是必需的,但它没有出现在 cnt:FirstXsd 内容中的任何位置。 CommonTypes.xsd 是否定义了名为“DocumentID”的全局元素?即使存在,您的 XSD 也不会引用它,因此不需要它作为 cnt:FirstXsd 的成员。
我不认为这是 XSD 验证的 Java 实现中的缺陷。请解释您想要实现的目标,以便我们提出更好的解决方案。
关于java - 无法使用多个 XSD schemaLocation 验证 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58489860/
我想生成这个 xml header : 问题是 xsi:schemaLocation 属性中的 namespace 。 这是我的代码: XNamespace mynamespace = "http
我正在使用 Jersey 创建一个安静的 Web 服务编码 XML。 我将如何设置 xsi:schemaLocation? 此 answer展示如何直接在 Marshaller 上设置 Marshal
我发现我们有多个 url 作为此属性的值,就像在 spring 中一样: 为什么需要它以及它的用途是什么? Spring 是否会访问 url 并进行验证?xmlns 和 xsi:schemaLoca
我必须将我的应用程序部署到没有互联网连接的计算机上。并且某些 Spring xsd 文件的 URL 无法访问我正在使用 spring 4.0.3 和 JDK7 和 maven。我的应用程序上下文:
我正在通过以...开头的 maven pom.xml 为什么我需要在这里使用 xsi:schemaLocation?我理解它是一种发现具有目标 namespace 的 XSD 的方法。但是当我使用
xml 架构位置包含 http://www.springframework.org/schema/beans ,它已经是架构全局命名空间。那么为什么它总是在 xsi:schemaLocation 元素
反序列化 XML 消息时遇到此错误: Unrecognized field "schemaLocation" (class com.example.RefreshTokenType), not mar
假设我有两个项目,A 和 B。Java 项目,以防这很重要。 项目 A 包含一堆表示核心类型和元素的 XSD 文件。它们都放在一个名为“定义”的包中。这被内置到 project-a.jar 中。 项目
如何将以下 xsi:schemaLocation 添加到序列化类中? 这是我到目前为止所做的: public class NewReleaseMessage { [XmlAttribute]
我正在使用 Spring 并且在 application-context.xml 我有以下定义: ..... 当我的互联网连接中断时,我无法通过 tomcat 或 jetty 运行我的应用程序。
例如,我不想像这样引用在线 XSD: 要像这样引用类路径 XSD: 最佳答案 没有标准化的方法可以做到这一点。某些产品可能支持类路径 URI:classpath:org/hibernat
我正在使用 xmllint检查一些工具 XML 反对他们的文件 XSD 模式。该工具似乎被调用为 xmllint --noout --schema foo.xsd bar.xml ...并且不包括检索
我尝试验证包含多个 XSD 的 XML,验证正常,但事实不应该如此。 例如,我的 XML 是 TEST_TEXT TEST_N
我用 C# 开发了一个 WCF 服务。我们的客户已经拥有一个用 Java 编写的客户端软件。他们说当他们尝试添加我们的 wcf 服务引用时,他们得到一个错误。他们认为关于命名空间的问题。 我不太了解
我正在尝试进行转换,但我遇到了 xsi:schemaLocation 未显示在 XML 结果上的问题。我已经搜索了为什么会发生这种情况,但我似乎无法找到它。请帮忙 输入 XML
请查看以下 XML 命名空间和架构位置。 我已经通过以下方式添加了 namespace ,这似乎工作正常: XmlSerializerNamespaces ns = new XmlSerializ
几天前,我开始学习 libxml2,用于在 Linux(Ubuntu 14.04)上解析 xml 文档。但不幸的是我有很多问题。 首先,当我使用函数 xmlParseDoc() 时出现错误消息: do
我正在尝试使用 groovy 将节点简单地添加到特定位置的 a 中。我的源模式如下所示 我想简单地添加一个与其他子节点内联的新子节点来生成输出
我有一个 WSDL,它的“类型”元素中包含 3 个模式。架构不是在外部 XSD 中定义的,而是在 types 元素中定义的。 我想在模式号 2 中自定义一个元素并更改它的名称以避免冲突。 那么在 sc
我使用 JAXP 创建一个 xml 文档并搜索插入 schemalocation 的方法。目前我的应用程序生成: ... 但我需要: ... 我的代码: StreamResult resu
我是一名优秀的程序员,十分优秀!