2010-09-08 18 views
0

我有a large XML schema有看起來像這樣的內容:如何最有效地獲得在C#中的類此的XML Schema

<xs:element name="Tmats"> 
    <xs:complexType> 
     <xs:sequence> 

      <xs:element name="ProgramName" type="xs:string" minOccurs="0"> 
       <xs:annotation> 
        <xs:documentation>PN</xs:documentation> 
       </xs:annotation> 
      </xs:element> 

      <xs:element name="TestItem" type="xs:string" minOccurs="0"> 
       <xs:annotation> 
        <xs:documentation>TA</xs:documentation> 
       </xs:annotation> 
      </xs:element> 

有效地使用它,我需要documentation元素的元素name屬性之間的關聯,並,如:

TestItem <==> TA 

我首先想到的是,要素應該有屬性來捕捉文檔元素,像這樣:

public partial class Tmats 
{ 
    [Documentation("PN")] 
    public string ProgramName { get; set; } 

    [Documentation("TA")] 
    public string TestItem { get; set; } 
} 

...但我關心性能,因爲這些屬性在正常使用過程中會被相當廣泛地掃描。

我第一次嘗試使用XSD.EXE創建C#類,但該工具似乎根本沒有捕獲註釋元素。另外,它創建的代碼非常難看。

對此提出建議?有沒有更好的方法來解決這個問題?

回答

1

您可能需要編寫自己的xsd.exe替換程序。 AFAIK xsd.exe不支持<xs:annotation>元素。

一個相當不錯的博客介紹瞭如何編寫自己的基於XSD的代碼生成器(它是中等複雜的,順便說一句,並根據我個人的經驗有沒有必要建立它太一般):

http://blogs.rev-net.com/ddewinter/2008/09/28/generate-serialization-classes-as-part-of-your-build-part-2/

注意:在博客條目中,<xs:annotation>節點用於通過CodeDOM生成文檔。當然,你可以生成更好的東西來滿足你的需求。

0

棘手的問題。你說這個模式很大。鋤頭你經常會預料到它會發生變化嗎?手工編寫C#版本可能很乏味,但如果預計變化不大,那麼您將獲得所需的接口,因爲您是編碼的接口。但是,如果它有機會經常更改,那麼需要頻繁更新映射和廣泛的單元測試套件,以確保不會破壞更新中的任何內容。

我過去所做的是使用XSD工具生成初始代碼,然後從生成的類中進行擴展,或者使其成爲一個部分類來修復我喜歡的接口。沒有任何意義,但它使我能夠生成大部分代碼,是的,醜陋的,但生成的,並定製我關心的接口,使它們更友好一點,並添加任何可能的錯誤/邊界檢查有用。

+0

它不會有太大的變化,但它代表了一個標準,所以如果它可以被導入而不是修補,它將會很好。 – 2010-09-08 17:27:58

相關問題