2016-03-01 8 views
0

У меня есть проблема с созданием надлежащего XML/JSON с помощью моего WebService при работе с тегами simpleContent в XSD.XSD simpleContent с API WCF/Web

Прежде всего, у меня есть только файл 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] в верхней части интерфейса, и voilà. Причина в том, что сериализатор по умолчанию (DataContractSerializer) не может правильно обрабатывать атрибуты xml. Кроме того, имейте в виду, что WCFStorm также использует DataContractSerializer: я обнаружил, что даже при использовании XmlSerializer у меня был плохой XML в WCFStorm. Затем я проверил с SoapUI, и он работал! (потеряно еще несколько часов).

Итак, давайте сделаем эту работу на моем проекте Web API, для JSON ....

ответ

0

Наконец-то я понял, решение. Просто напоминание: моя цель состояла в том, чтобы не касаться созданного класса.

Для SOAP/XML Как указано в моем обновлении, решение было довольно легко, я просто поставить следующий атрибут на интерфейсе WCF:

[XmlSerializerFormat] 

для отдыха/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; 
} 

Помните, что это возможно только в том случае, если ваш базовый класс является частичным.

Конечно, это код с высоким уровнем обслуживания, но, по крайней мере, это не путает с автоматически созданным классом.

Смежные вопросы