Как сделать набор веб-сервисов dotnet minOccurs= " 1 " для строкового значения

у меня есть XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns="http://a.com/a.xsd"
     targetNamespace="http://a.com/a.xsd"
     elementFormDefault="qualified"
     attributeFormDefault="unqualified">
    <xs:element name="A">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Item"  minOccurs="1" maxOccurs="1">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:minLength value="1"/>                                       
                            <xs:whiteSpace value="collapse"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

который я преобразовал в класс C# с помощью XSD.exe v2.0.50727.3615, который генерирует код следующим образом

namespace A {
    using System.Xml.Serialization;
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://a.com/a.xsd")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://a.com/a.xsd", IsNullable=false)]
    public partial class A {
        private string itemField;
        /// <remarks/>
        public string Item {
            get {
                return this.itemField;
            }
            set {
                this.itemField = value;
            }
        }
    }
}

Я возвращаю объект A. A в моем веб-сервисе, который создает этот фрагмент в описании службы

<s:schema elementFormDefault="qualified" targetNamespace="http://a.com/a.xsd"> 
  <s:element name="Test2Result"> 
    <s:complexType> 
      <s:sequence> 
        <s:element minOccurs="0" maxOccurs="1" name="Item" type="s:string" /> 
      </s:sequence> 
    </s:complexType> 
  </s:element> 
</s:schema> 

изменение от minOccrus= "1"в XSD к minOccurs=" 0 " на автоматически сгенерированном WSDL вызывает горе машине на другом конце системы.

Я могу конечно предоставьте ручной отредактированный WSDL для их использования, но я хотел бы, чтобы автоматически сгенерированный соответствовал их потребностям.

любые предложения о том, как убедить dotnet выводить minOccurs="1" для строкового типа в его автогенерированных WSDLs без добавления nillable="true"?

3 ответов


отмечаю следующую строку:

для связывания сложных типов схем XML с классами, не зависящими от XML, платформа .NET Framework не предоставляет прямой язык программирования, эквивалентный атрибуту minOccurs или maxOccurs.

отсюда:http://msdn.microsoft.com/en-us/library/zds0b35c (v=против 85).aspx


ссылки

согласно MSDN Поддержка Привязки Атрибутов MinOccurs, есть только 2 способа получить MinOccurs = 1.

  1. тип значения без значения по умолчанию или сопутствующего логического поля.

    результат: minOccurs значение выходного элемента устанавливается в 1

  2. ссылочный тип с атрибутом xmlelement IsNullable свойству установлено значение true.

    результат: minOccurs значение выходного элемента устанавливается в 1. В элементе атрибут nillable также имеет значение true.

свойство типа строка (к сожалению) всегда имеет значение по умолчанию

string.Empty

поэтому он никогда не может иметь null значение по умолчанию. Это означает, что мы никогда не сможем удовлетворить первое решение. Единственный способ создать MinOccurs=1 для строк, чтобы сделать элемент тип nullable:

C#

[XmlElementAttribute(IsNullable = true)]
public string Item { ... }

В. Б.

<XmlElement(IsNullable:=True)>
Public Item As String

решение

единственным реальным решением является редактирование XSD вручную... boo xsd.исполняемый.

Еще Плохие Новости

даже если бы это было возможно, Ник DeVore связан с ответ Джона Саундера в другом потоке, в котором говорится, что поле не используется для входящих XMLs. Так что это еще пользователь может отправить недопустимый XML.


по ответы этой Итак, вопрос, это невозможно. Джон Сондерс говорит:

оказывается, что WSDL не используется проверка входящего XML. Это не неважно, сможешь ты или нет. укажите minOccurs - это не будет используется для проверки входных данных.