【问题标题】:XSD the element cannot contain text. content model is empty after adding xs:uniqueXSD 元素不能包含文本。添加 xs:unique 后内容模型为空
【发布时间】:2016-10-18 16:43:15
【问题描述】:

下面是我的 XML 和验证 XSD。看起来我的 xs:unique 约束对 id 字段有问题。

<?xml version='1.0' encoding='utf-8'?>
<records>
  <record>
    <date>2016-02-01</date>
    <id>3</id>       
  </record>
  <record>
    <date>2016-02-01</date>
    <id>4</id>
  </record>
  <record>
    <date>2016-02-01</date>
    <id>7</id>
  </record>
</records>

XSD:

 <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="records">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="record" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:date" name="date"/>
                  <xs:element name="id" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:attribute name="recordid" type="xs:integer"/>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
              <xs:unique name="Unique-id">
                <xs:selector xpath="id" />
                <xs:field xpath="@recordid" />
              </xs:unique>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    您的 XSD 与您的 XML 并不完全相关:在您的 XSD 中,您提到了代码中不存在的属性 recordid

    假设你的 XML 是正确的,这里是应该给你正确结果的相应 XSD

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="records">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="record" maxOccurs="unbounded" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element type="xs:date" name="date"/>
                            <xs:element name="id" type="xs:integer"/>                            
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>            
        </xs:complexType>
        <xs:unique name="Unique-id">
            <xs:selector xpath="record" />
            <xs:field xpath="id" />
        </xs:unique>                                
    </xs:element>
    

    【讨论】:

    • 这是在记录级别进行验证,即当我收到错误时,行号指向父级别元素 而不是子元素 。无论如何我可以直接验证子元素吗?我将错误行号用于显示目的。
    【解决方案2】:

    我遇到了与 XML 类似的问题:

    <SomeRoot>
      <SomeElement SomeAttribute="1"></SomeElement>
    </SomeRoot>
    

    问题出在标签 SomeElement 中,它包含算作文本的空字符串。所以我的解决方案是 - 使用自我关闭标签:

    <SomeRoot>
      <SomeElement SomeAttribute="1" />
    </SomeRoot>
    

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 2010-12-17
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2020-09-10
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多