2011-08-19 41 views
2

我已經接收到的XSD架構MainSchema.XSD並且還common.xsd模板包含的架構。創建類對象使用XSD.EXE

在MainSchema.xsd我有以下行:

<xs:include schemaLocation="Common.xsd"/> 

而且Common.Xsd舉辦各種類型像數據的定義:

<xs:simpleType name="SSN"> 
    <xs:annotation> 
     <xs:documentation>Social security number is 10 digits</xs:documentation> 
     <xs:appinfo> 
      <altova:exampleValues> 
       <altova:example value="5412983209"/> 
       <altova:example value=""/> 
      </altova:exampleValues> 
     </xs:appinfo> 
    </xs:annotation> 
    <xs:restriction base="xs:string"> 
     <xs:whiteSpace value="collapse"/> 
     <xs:pattern value="([0-9]{10})?"/> 
    </xs:restriction> 
</xs:simpleType> 

和MainSchema我所說的屬性SSNField類型SSN:

<xs:attribute name="CompanySSN" type="SSN"> 
    <xs:annotation> 
     <xs:documentation>SSN number of Company</xs:documentation> 
    </xs:annotation> 
</xs:attribute> 

當我使用此命令創建ac#對象類:

XSD.EXE -c -l:C#MainSchema.xsd Common.Xsd

它然後創建了一個名爲對象:

MainSchema_Common.cs

在i驗證對象反對這個模式它出現了一個例外:

{「類型'http://schemas.domain.com:SSN'沒有聲明,或不是一個簡單的類型PE。「}

有誰知道什麼i'm做錯了什麼?

熊,我從外部接收到這個XSD架構和有人告訴我,有這個文件沒有錯誤MYND。

誠懇 AGH

回答

1

你需要解釋一下你是如何驗證。我假設你正在創建一個類的實例,然後序列化爲XML,而XML不驗證?

你需要知道,僅僅因爲你的XML序列化是使用XSD.EXE並不自動意味着將XML兼容模式派生類型的產品。

您可以通過注入一個覆蓋根命名空間或實際上其它節點在文檔中需要主要XmlSerializer的。

例如在某一節點注入命名空間:

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 

var elementAttribute = new XmlElementAttribute(typeof(SSN)) 
{ 
    ElementName = "SSN", 
    Namespace = "http://schemas.domain.com:SSN" 
}; 

var newAttribute = new XmlAttributes(); 
newAttribute.XmlElements.Add(elementAttribute); 
overrides.Add(typeof(ParentNodeType), "SSN", newAttribute); 

要調用serilaizer:

XmlSerializer serializer = new XmlSerializer(typeof(MyType), overrides); 

希望這有助於

+0

感謝您的回答,你是什麼意思「ParentNodeType」 – aghaux

+0

看起來您需要在序列化期間爲特定節點注入命名空間。爲了做到這一點,您需要告訴序列化程序要將名稱空間應用於的節點的父節點的類型。我不確定這是爲什麼,但這就是它的工作原理。 –

+0

好的很好的答案謝謝,但我還沒有設法得到這個工作。所以我只是把代碼上Common.Xsd,所包含的XSD文件,並把它合併進mainSchema.xsd並重新生成的對象和它的工作。 使用包含的模式文件非常沮喪,並且沒有使這些東西與XML驗證一起工作。 – aghaux