2012-01-06 97 views
4

我正在使用XmlReader來驗證Xml是否針對Xsd。XmlSchemaValidationException:'B'元素未聲明

當我驗證此XML

<?xml version="1.0" encoding="utf-8" ?> 
<A><B>sdf</B></A> 

根據該模式:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="B" type="xs:string" /> 

<xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="B"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

驗證確定。

但是,如果我添加命名空間:

<?xml version="1.0" encoding="utf-8" ?> 
<A xmlns="myns"><B>sdf</B></A> 

和相應的模式:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns"> 

<xs:element name="B" type="xs:string" /> 

<xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="B"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

我接受System.Xml.Schema.XmlSchemaValidationException:在 'B' 元素未聲明。 爲什麼會發生這種情況?我怎樣才能添加一個名稱空間?

回答

5

您得到驗證錯誤的原因是您的模式實際上是兩個模式。您有兩個根元素A和B.根元素不能隱式地用作類型。您需要告訴XSD您想使用來自其他模式的類型(使用導入),或者將這些類型設置爲模式的本地類型(使用complexType定義)。

示例:將B抽出到它自己的模式中。它不能共享同一個命名空間:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns" xmlns:myns2="myns2"> 

    <xs:import namespace="myns2" /> 

    <xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="myns2:B" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

這可以讓你有以下有效的XML實例:

<?xml version="1.0" encoding="utf-8" ?> 
<A xmlns="myns"> 
    <B xmlns="myns2">sdf</B> 
</A> 

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns2"> 
    <xs:element name="B" type="xs:string" /> 
</xs:schema> 

然後,你可以通過使用進口從A型參考B

您能夠驗證非命名空間版本的類型的原因是因爲爲了成爲有效的XML,兩件事情必須是真實的:

  • 良好的XML
  • 必須符合任何引用的模式類型

在非namespace'd XML文件中,有定義的任何模式類型沒有提及,所以因此文檔是有效的XML。

+0

+1用於提示從模式A提取模式B.它幫助了我! :) – Learner 2012-07-05 11:53:04