【问题标题】:The 'ref' attribute cannot be present. validation error in C#'ref' 属性不能存在。 C#中的验证错误
【发布时间】:2013-03-13 06:53:29
【问题描述】:

我根据以下方法做了一些xml Xsd验证: Xml validation using XSD schema

 .......................................................
 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(感谢您的 cmets):在这种情况下,有什么方法可以使用 xml 验证此 XSD:

【问题讨论】:

  • 你用“java”标记了这个问题,因为......?
  • this 问题可能会有所帮助
  • 我知道不推荐使用 w3cschools,但在 their site 它说 ref Optional。指定对命名属性的引用。 Name 和 ref 属性不能同时存在。 如果 ref 存在,则 simpleType 元素、表单和类型不能存在。所以你是对的。
  • 谢谢:但我认为您的链接 XML Schema attribute Element:(w3schools.com/schema/el_attribute.asp) 正在讨论属性元素:因为 Name 和 ref 属性不能同时存在. "XML Schema element Element" 怎么没有说 name 和 ref 不能出现在同一个元素中:
  • 然而,默认值是正确的。 name 和 ref 属性在 XSD 命名空间中可以携带 name 或 ref 属性的每个元素上是互斥的。使用 'name' 表示这是一个声明(属性、元素、类型……),使用 'ref' 表示这是对某事物的引用(属性、元素、类型、.. .) 在别处声明。

标签: c# .net xml xsd xsd-validation


【解决方案1】:

在我看来 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>

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

【讨论】:

    【解决方案2】:

    您的架构无效,因为顶级元素声明中不允许使用 ref 属性。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      相关资源
      最近更新 更多