2013-03-13 23 views
1

我就照下面的方法一些XML XSD验证: Xml validation using XSD schema'ref'属性不能出现。在C#中验证错误

....................................................... 
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()) 
{ 

} 
........................................................... 

,这让我错误说: “这个‘裁判’属性不能出现”

我的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> 

我相信,因为这两个“名”“裁判”发生此错误:属性存在相同的元素:但是我觉得这是没有错的XSD(感激对此有何评论):在这情况下,有没有办法来验证这个XSD的XML:

+2

你用“java”标记了这个问题,因为......? – 2013-03-13 06:55:43

+0

对不起, – Bathiya 2013-03-13 07:13:00

+0

[这](http://stackoverflow.com/q/8896602/238902)问题可能是帮助 – Default 2013-03-13 07:17:57

回答

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> 

如果要定义一个企业的结构元素索姆在哪里(但不是它的名字),并在别处引用它,它应该是一个类型。

0

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

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

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

相关问题