元素“Root”的命名空间必须来自模式命名空间“http://www.w3.org/2001/XMLSchema”?
我有一个 xml 文档:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Child name="MyType" compareMode="EQ"></Child>
</Root>
我想在以下 xsd 的帮助下验证此 xml:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element name="Child">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="compareMode" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
当我尝试验证它时,我收到以下错误:
Exception in thread "main" org.xml.sax.SAXException: Validation failed against correct.xml. ErrorMessage:s4s-elt-schema-ns: The namespace of element 'Root' must be from the schema namespace, 'http://www.w3.org/2001/XMLSchema'.
我的问题是为什么 Root 必须位于模式的命名空间?难道是我验证xml文档不正确?
公共同步布尔 isValid(String xmlFragment, File xmlSchema) 抛出 SAXException、IOException{
// 1. 查找 W3C XML Schema 语言的工厂
SchemaFactory 工厂 = SchemaFactory.newInstance(“http://www.w3.org/2001/XMLSchema”); // 2. 编译架构。 模式模式=factory.newSchema(xmlSchema); // 3. 从模式中获取验证器。 验证器 validator = schema.newValidator(); // 4. 解析要检查的文档。 源源 = new StreamSource(new ByteArrayInputStream(xmlFragment.getBytes())); // 5.检查文档 验证器.validate(源); 返回真; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
难道 xmlSchema 保存的不是您向我们展示的模式,而是 W3C 发布的“模式文档的模式”?错误消息片段“ErrorMessage:s4s-elt-schema-ns:”似乎暗示了这一点。
Could it be that xmlSchema holds not the schema you have shown us, but the "schema for schema documents" published by W3C? The error message fragment "ErrorMessage:s4s-elt-schema-ns:" seems to hint at this.
该文档在定义的模式下有效,因此它必须与代码有关。
对所需命名空间(如错误消息中指定)的唯一显式引用是在
SchemaFactory.newInstance
调用中。如果您在那里传递一个空的(“”)命名空间,会发生什么?此外,在架构的 XML 文档中显式设置预期的命名空间也是一种很好的风格。有几种方法可以做到这一点。由于您选择为 XMLSchema 命名空间添加前缀,因此我建议将 标记中。
xmlns="" targetNamespace=""
添加到您的The document is valid under the defined schema, so it must be something with the code.
The only explicit reference to the wanted namespace (as specified in the error message) is in the
SchemaFactory.newInstance
call. What happens if you pass an empty ("") namespace there?Also, it is good style to explicitly set the expected namespace in the XML document in the schema. There are several ways to do this. Since you chose to prefix the XMLSchema-namespace, I would recommend to add
xmlns="" targetNamespace=""
to your<xs:schema
tag.