2010-01-21 112 views
1

我有很多XML模式的使用JAXB(Java體系XML綁定)標記,類似於以下內容:生成C#類

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="1.0"> 
    <xs:element name="H"> 
    <xs:annotation> 
     <xs:appinfo> 
     <jxb:class name="Header" /> 
     </xs:appinfo> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="X" minOccurs="1" maxOccurs="1"> 
      <xs:annotation> 
      <xs:appinfo> 
       <jxb:property name="SessionControl"/> 
      </xs:appinfo> 
      </xs:annotation> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="X" type="xs:string"> 
    <xs:annotation> 
     <xs:appinfo> 
     <jxb:class name="SessionControl"/> 
     </xs:appinfo> 
    </xs:annotation> 
    </xs:element> 
</xs:schema> 

從這些我需要生成C#類。

上述模式運行XSD.EXE生成以下(某些屬性爲清楚起見移除):

[XmlRoot(Namespace = "", IsNullable = false)] 
public partial class H 
{ 
    private string xField; 

    public string X 
    { 
     get { return this.xField; } 
     set { this.xField = value; } 
    } 
} 

很顯然,這是不理想 - 我需要考慮的jxb:classjxb:property標記的模式,給了我一個使用更易讀的jxb名稱的類,但是它序列化爲架構中指定的單字符元素/屬性。

例如

[XmlRoot(Namespace = "", IsNullable = false, ElementName = "H")] 
public partial class Header 
{ 
    private string xField; 

    [XmlElement(ElementName = "X")] 
    public string SessionControl 
    { 
     get { return this.xField; } 
     set { this.xField = value; } 
    } 
} 

有沒有合理的途徑來實現這個目標?

回答

0

我們最終使用的方法是手動完成工作 - 從xsd.exe生成的C#源代碼中,使用xsd文件作爲參考。

2

我知道,在Java端,就可以告訴額外的綁定信息的JAXB處理器三種不同的方式:

  1. 在XSD本身就像你在你的問題提出的。
  2. 在該工具使用的單獨的xml文件中。
  3. 在java類自己的註釋。

所有這些方法都是在語義上等效 - 所以嚴格來說,<JXB>標籤是不是XSD合同的一部分。可以使用上面的選項2或3來構造略有不同的java代碼,但具有相同的xsd和wsdl合約。

我期望在.NET一側的工具集中存在類似的機制。我建議你查找xsd.exe和相關信息的參考資料,看看對生成的代碼的定製有什麼支持(對不起,我不能幫助更多,我不熟悉這個工具)。