在处理XSD中的simpleContent标记时,我遇到了使用我的WebService生成正确XML / JSON的问题。
首先,我只有一个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上看到Xsd.Exe无法识别simpleContent限制。
有没有办法让这种“标准”输出或.Net根本无法做到?
由于
更新
我能够使它适用于我的WCF服务。解决方案很简单......只需将[XmlSerializerFormat]放在界面的顶部,然后就可以了。 原因是默认的序列化程序(DataContractSerializer)无法正确处理xml属性。 另外,请注意WCFStorm也使用DataContractSerializer:我发现即使使用XmlSerializer,我在WCFStorm中也有错误的XML。然后我检查了SoapUI,它正在工作! (还剩几个小时)。
现在,让我们在我的Web API项目中使用JSON ....
答案 0 :(得分:0)
最后我想出了一个解决方案。提醒一下:我的目标不是触及生成的课程。
适用于SOAP / XML 正如我的更新中所述,解决方案非常简单,我只是在WCF接口上添加以下属性:
[XmlSerializerFormat]
适用于REST / JSON 解决方案是为那些没有很好转换的“烦恼”类定义MetadataType类。
例如,以下是在自动生成的文件中定义VerticalDataValue类的方法(我剥离了属性和名称空间):
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;
}
请注意,只有在您的基类是部分基础时才可以这样做。
当然,这是高维护代码,但至少这不会影响自动生成的类。