& # 39;裁判# 39;属性不能存在.c#中的验证错误

本文关键字:错误 验证 不能 裁判 属性 存在 | 更新日期: 2023-09-27 18:03:33

我按照以下方法做了一些xml Xsd验证:使用XSD模式的Xml验证

 .......................................................
 XmlReaderSettings settings = new XmlReaderSettings();
 settings.Schemas.Add(null, xsdFilePath);
 settings.ValidationType = ValidationType.Schema;
 settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);
 XmlDocument document = new XmlDocument();
 document.Load(xmlFilePath);
 XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings);
 while (rdr.Read())
 {
 }
 ...........................................................

,它给我的错误说:" 'ref'属性不能存在"

我的XSD看起来像:

...........
<xs:element name="totals" minOccurs="0" ref="DocTotal"/>
..................................
<xs:element name="DocTotal">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="totalQty" minOccurs="0" type="xs:decimal"/>
            <xs:element name="totalTax" minOccurs="0" type="xs:decimal"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>

和我的XML看起来像:

<totals>
    <totalQty>800</totalQty>
    <totalTax>0.00<totalTax>
</totals>

我相信这个错误的发生是因为"name""ref":属性存在于相同的元素中:但是我认为这在XSD中并没有错(感谢您对此的评论):在这种情况下,是否有任何方法来验证这个XSD与xml:

& # 39;裁判# 39;属性不能存在.c#中的验证错误

在我看来,DocTotal应该是一个类型,而不是一个元素:

<xs:element name="totals" minOccurs="0" type="DocTotal"/>
..................................
<xs:complexType name="DocTotal">
    <xs:sequence>
      <xs:element name="totalQty" minOccurs="0" type="xs:decimal"/>
      <xs:element name="totalTax" minOccurs="0" type="xs:decimal"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>

如果你想在某个地方(但不是它的名字)定义结构,并在其他地方引用它,它应该是一个类型

模式无效,因为在顶层元素声明中不允许使用ref属性。

这至少可以在模式的模式中看到,这是W3C XML模式推荐的规范部分。http://www.w3.org/TR/xmlschema-1/normative-schemaSchema

ref属性用于引用全局(=在顶层定义)元素、类型、属性、组等。如果希望全局定义两个具有相同类型但名称不同的元素,则可以声明一个全局(命名)类型,然后在元素声明中引用该类型。这是通过使用type属性来完成的,就像@Damien_The_Unbeliever在他们的回答中所做的那样。