元素“Root”的命名空间必须来自模式命名空间“http://www.w3.org/2001/XMLSchema”?

发布于 2024-10-16 09:02:27 字数 1752 浏览 1 评论 0 原文

我有一个 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(源);        
    返回真;
}

I have an xml document:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Child name="MyType" compareMode="EQ"></Child>
</Root>

And I would like to validate this xml with help of the following xsd:

<?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>

When I try to validate it I receive the following error:

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'.

My question is why Root has to be in the namespace of schema? Could that be that I validate the xml document not correctly?

public synchronized boolean isValid(String xmlFragment, File xmlSchema) throws SAXException, IOException{

// 1. Lookup a factory for the W3C XML Schema language

SchemaFactory factory = 
    SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

// 2. Compile the schema. 

Schema schema = factory.newSchema(xmlSchema);

// 3. Get a validator from the schema.
Validator validator = schema.newValidator();

// 4. Parse the document you want to check.
Source source = new StreamSource(new ByteArrayInputStream(xmlFragment.getBytes()));

// 5. Check the document    
    validator.validate(source);        
    return true;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

喜你已久 2024-10-23 09:02:27

难道 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.

榆西 2024-10-23 09:02:27

该文档在定义的模式下有效,因此它必须与代码有关。

对所需命名空间(如错误消息中指定)的唯一显式引用是在 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文