【问题标题】:Error cvc-complex-type.2.4.d during XSD validationXSD 验证期间出现错误 cvc-complex-type.2.4.d
【发布时间】:2018-12-31 17:07:11
【问题描述】:

我正在尝试使用 XSD 架构验证一些 XML 文件,但我收到错误 cvc-complex-type.2.4.d: Invalid Content was found Starting with Element 'Number'。此时预计没有子元素。第 '31' 行,第 11 列。

这涉及到都继承自 PrintableText 类的字段 NumberDescription

我已经尝试在 <xs:element /> 对象中更改 minOccursmaxOccurs,但这会导致相同的行为。

XML 文件:

<?xml version="1.0"?>
<Receipt>
  <Items>
    <FiscalItem>
      <Name>Przedmiot 1</Name>
      <ReturnablePackaging>false</ReturnablePackaging>
      <Quantity>1</Quantity>
      <PTU>A</PTU>
      <OriginalPrice>1.0</OriginalPrice>
      <Price>1.0</Price>
    </FiscalItem>
    <FiscalItem>
      <Name>Przedmiot 2</Name>
      <ReturnablePackaging>false</ReturnablePackaging>
      <Quantity>1</Quantity>
      <PTU>B</PTU>
      <OriginalPrice>1.0</OriginalPrice>
      <Price>5.0</Price>
    </FiscalItem>
  </Items>
  <Tedners>
    <FiscalTender>
      <Type>CASH</Type>
      <Amount>5.0</Amount>
    </FiscalTender>
    <FiscalTender>
      <Type>CREDITCARD</Type>
      <Amount>5.0</Amount>
    </FiscalTender>
  </Tedners>
  <!-- VVV THIS IS LINE VVV -->
  <Description>
    <Value>180</Value>
  </Description>
  <Number>
    <Value>12345</Value>
  </Number>
</Receipt>

XSD 文件:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Receipt" nillable="true" type="Receipt" />
  <xs:complexType name="Receipt">
    <xs:complexContent mixed="false">
      <xs:extension base="FiscalDocumentBase">
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" name="Number" type="ReceiptNumber" />
          <xs:element minOccurs="0" maxOccurs="1" name="Description" type="ReceiptDescription" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FiscalDocumentBase" abstract="true">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" nillable="true" name="Items" type="ArrayOfFiscalItem" />
      <xs:element minOccurs="0" maxOccurs="unbounded" nillable="true" name="Tedners" type="ArrayOfFiscalTender" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ArrayOfFiscalItem">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="FiscalItem" nillable="true" type="FiscalItem" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="FiscalItem">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" name="ReturnablePackaging" type="xs:boolean" />
      <xs:element minOccurs="1" maxOccurs="1" name="Quantity" type="xs:decimal" />
      <xs:element minOccurs="0" maxOccurs="1" name="PTU" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" name="OriginalPrice" type="xs:decimal" />
      <xs:element minOccurs="1" maxOccurs="1" name="Price" type="xs:decimal" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ArrayOfFiscalTender">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="FiscalTender" nillable="true" type="FiscalTender" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="FiscalTender">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="Type" type="FiscalTenderType" />
      <xs:element minOccurs="1" maxOccurs="1" name="Amount" type="xs:decimal" />
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="FiscalTenderType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="CASH" />
      <xs:enumeration value="CREDITCARD" />
      <xs:enumeration value="CHECK" />
      <xs:enumeration value="BOND" />
      <xs:enumeration value="CREDIT" />
      <xs:enumeration value="OTHER" />
      <xs:enumeration value="VOUCHER" />
      <xs:enumeration value="ACCOUNT" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="PrintableText">
    <xs:simpleContent>
      <xs:extension base="xs:string" />
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="ReceiptNumber">
    <xs:simpleContent>
      <xs:extension base="PrintableText" />
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="ReceiptDescription">
    <xs:simpleContent>
      <xs:extension base="PrintableText" />
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>

编辑:删除 Number 字段会导致验证通过。

【问题讨论】:

  • 考虑在您的 XML 中添加如下注释:&lt;!-- This is line 31 --&gt;
  • @Flydog57 完成!

标签: c# xml xsd


【解决方案1】:

好的...所以我的朋友发现了问题。在 XSD 架构中,元素的顺序应该不同。

原文:

...
<xs:element minOccurs="0" maxOccurs="1" name="Number" type="ReceiptNumber" />
<xs:element minOccurs="0" maxOccurs="1" name="Description" type="ReceiptDescription" />
...

固定:

...
<xs:element minOccurs="0" maxOccurs="1" name="Description" type="ReceiptDescription" />
<xs:element minOccurs="0" maxOccurs="1" name="Number" type="ReceiptNumber" />    
...

【讨论】:

  • 不要忘记使用答案旁边的绿色勾号来表明这是解决您问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2014-02-04
  • 1970-01-01
  • 2019-02-07
  • 2015-05-05
  • 2021-04-27
相关资源
最近更新 更多