2016-03-01 16 views
0

當我在處理XSD中的simpleContent標記時,我的問題是我的WebService產生了正確的XML/JSON。XSD簡單內容與WCF/Web API

首先,我只有一個XSD文件(沒有WSDL),與此內容(簡體):

<xs:complexType name="VerticalDataValue">  
    <xs:simpleContent> 
    <xs:extension base="NCADevicePublication:Double"> 
     <xs:attribute name="unit" type="NCADevicePublication:VerticalUnitEnum" /> 
    </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 

<xs:simpleType name="Double"> 
    <xs:restriction base="xs:double" /> 
</xs:simpleType> 

<xs:simpleType name="VerticalUnitEnum"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="ft"></xs:enumeration> 
    <xs:enumeration value="m"></xs:enumeration> 
    </xs:restriction> 
</xs:simpleType> 

我然後使用XSD.EXE產生我的課。

我有什麼期望這個結構,對XML輸出:

<altitudeCoordinate unit="ft">2.1</altitudeCoordinate> 

我能得到什麼:

<altitudeCoordinate> 
    <Value>2.1</Value> 
    <unit>ft</unit> 
    <unitSpecified>true</unitSpecified> 
</altitudeCoordinate> 

的JSON一樣,我希望:

"altitudeCoordinate": { 
     "@unit": "ft", 
     "text": "2.1" 
} 

但我得到:

"altitudeCoordinate":{ 
     "unit": "ft", 
     "unitSpecified": "true, 
     "Value": 2.1 

我在MSDN上看到simpleContent限制無法被Xsd.Exe識別。

有沒有辦法讓這種「標準」輸出或.Net不能做到這一點?

感謝

UPDATE

我能夠讓我的WCF服務工作。解決方案非常簡單,只需將[XmlSerializerFormat]放在界面頂部即可。 原因是默認序列化程序(DataContractSerializer)無法正確處理xml屬性。 另外,請注意WCFStorm也使用DataContractSerializer:我發現即使在使用XmlSerializer時,我在WCFStorm中也遇到了錯誤的XML。然後我檢查了SoapUI,它正在工作! (仍然失去了幾個小時)。

所以,現在,讓我們在我的Web API項目這項工作中,JSON ....

回答

0

最後我想出一個解決方案。提醒一下:我的目標不是觸及生成的課程。

對於SOAP/XML 正如我的更新說明,該解決方案是很容易的,我只是把下面的屬性WCF接口:

[XmlSerializerFormat] 

對於REST/JSON 解決方案是爲那些沒有很好轉換的「煩人」類定義MetadataType類。

例如,這裏是VerticalDataValue類是如何在自動生成的文件中定義的(I剝去屬性和名稱空間):

public partial class VerticalDataValue { 

/// <remarks/> 
[System.Xml.Serialization.XmlAttributeAttribute()] 
public VerticalUnitEnum unit; 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool unitSpecified; 

/// <remarks/> 
[System.Xml.Serialization.XmlTextAttribute()] 
public double Value; 
} 

我創建另一個文件中,包含所有MetadataType類,如以下定義的:

[MetadataType(typeof(VerticalDataValueMetaClass))] 
public partial class VerticalDataValue { } 
public class VerticalDataValueMetaClass 
{ 
    [JsonProperty("@unit")] 
    public VerticalUnitEnum unit; 

    [JsonIgnore] 
    public bool unitSpecified 

    [JsonProperty("text")] 
    public double value; 
} 

請注意,只有當您的基類是部分類時纔可能。

當然,這是高維護代碼,但至少這不會與自動生成的類混淆。