xml - 为什么 XSD 验证需要带有大括号的 {element} 而不仅仅是 element?

标签 xml xsd xsd-validation xml-validation

当我尝试根据以下 XSD 验证以下 XML 时,出现以下错误:

cvc-complex-type.2.4.a: Invalid content was found starting with element >'personal'. One of '{personal} expected.

XML

<main xmlns = "http://www.example.com"
      xmlns:xsi = "https://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation = "main.xsd">
  <personal>
    <full-name>John Smith</full-name>
    <contact>
      <street-address>12345 Example Street</street-address>
      <city>Somewhere</city>
      <state>EX</state>
      <postal-code>111 111</postal-code>
      <phone>123 456 7890</phone>
      <email><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b1dcc8d4dcd0d8ddf1d4c9d0dcc1ddd49fd2dedc" rel="noreferrer noopener nofollow">[email protected]</a></email>
    </contact>
  </personal>
</main>  

XSD

<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
            targetNamespace = "http://www.example.com"
            xmlns = "http://www.example.com">
  <xsd:element name = "main" type = "main-type"/>

  <xsd:complexType name = "main-type">
    <xsd:all>
      <xsd:element name = "personal" type = "personal-type"/>
    </xsd:all>
  </xsd:complexType>

  <xsd:complexType name = "personal-type">
    <xsd:all>
      <xsd:element name = "full-name" type = "xsd:string" 
                   minOccurs = "1"/>
      <xsd:element name = "contact" type = "contact-type" 
                   minOccurs = "1"/>
    </xsd:all>
  </xsd:complexType>

  <!--Different xsd:strings for contact information in contact-type-->
  <xsd:complexType name = "contact-type">
    <xsd:all>
      <xsd:element name = "street-address" type = "xsd:string"/>
      <xsd:element name = "city" type = "xsd:string"/>
      <xsd:element name = "state" type = "xsd:string"/>
      <xsd:element name = "postal-code" type = "xsd:string"/>
      <xsd:element name = "phone" type = "xsd:string"/>
      <xsd:element name = "email" type = "xsd:string"/>
    </xsd:all>
  </xsd:complexType>
</xsd:schema>

有什么问题以及如何解决它?

最佳答案

您发布的 XML 在您发布的错误消息之前存在两个初步问题:

  1. 改变

    xmlns:xsi = "https://www.w3.org/2001/XMLSchema-instance"
    

    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    
  2. 改变

    xsi:schemaLocation = "main.xsd"
    

    xsi:schemaLocation = "http://www.example.com main.xsd"
    

现在,您发布的 XML 和 XSD 实际上将处于显示您发布的问题的状态:

[Error] main.xml:4:13: cvc-complex-type.2.4.a: Invalid content was found starting with element 'personal'. One of '{personal}' is expected.

说明:此错误告诉您,根据您的 XSD,personal 不应位于任何命名空间中; One of '{personal}' is Expected 中的 {} 表明了这一点。

您可能会认为,由于您的 XSD 声明了 targetNamespace="http://www.example.com",因此它的所有组件都被放置在 http://www.example.com 中。 example.com 命名空间。对于本地声明的组件而言,情况并非如此,但是除非您设置elementFormDefault="qualified"——默认为不合格.

默认情况下,本地声明的元素不存在命名空间

因此,请进行最后一项更改:添加

elementFormDefault="qualified"

添加到 xsd:schema 元素,然后您的 XML 对您的 XSD 有效。

另请参阅 this answer about what elementFormDefault means .

关于xml - 为什么 XSD 验证需要带有大括号的 {element} 而不仅仅是 element?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46750490/

相关文章:

xml - XSD 元素不是 Null 或 Xml 的空约束?

c# - XmlSchema.Read 无法正确加载 xsd

xsd - schemagen.exe 生成具有 <xs :complexType> 的不确定顺序的 xsd 架构

java - 向上按钮退出应用程序?

xml - GWT 和 Sencha GXT : FormPanel result fails

xml - 如何在 XML/XSD 中定义整数范围?

xml - XSD 断言无法识别

java - 如果定义了 maxLength 和模式限制,则针对长字符串验证 XML 的速度会很慢

javascript - list 文件中的 update_url 禁用我的 chrome 扩展

Java JAX-WS xs :dateTime with format UTC and Local