我按照以下方法进行了一些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中没有错误(感谢您对此的评论):在这种情况下,有任何方法可以使用xml验证此XSD:
答案 0 :(得分:2)
在我看来,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>
如果你想在某个地方(而不是它的名字)定义一个元素的结构,并在别处引用它,它应该是一个类型。
答案 1 :(得分:0)
您的架构无效,因为顶级元素声明不允许使用ref
属性。
这至少可以在模式的模式中看到,模式是W3C XML Schema建议的标准部分。 http://www.w3.org/TR/xmlschema-1/#normative-schemaSchema
ref
属性用于引用全局(=在顶层定义)元素,类型,属性,组等。如果要全局定义两个具有相同类型但名称不同的元素,您可以声明一个全局(命名)类型,然后在元素声明中引用该类型。这是通过使用type
属性完成的,就像@Damien_The_Unbeliever在答案中所做的那样。