Как сделать так, чтобы веб-сервис dotnet установил minOccurs = "1" в строковое значение - PullRequest
8 голосов
/ 18 октября 2010

У меня есть 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;
            }
        }
    }
}

Явозвращая объект AA в моем веб-сервисе, который создает этот фрагмент в описании сервиса

<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" для строкового типа в его автоматически сгенерированных WSDL без добавления nillable = "true"?

Ответы [ 3 ]

9 голосов
/ 07 июня 2013

Ссылки

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

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

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

  2. Тип ссылки со свойством IsNullable атрибута XmlElement, установленным в true.

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

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

string.Empty

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

C #

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

VB

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

Решение

Единственное реальное решение - редактировать XSD вручную ... boo xsd.exe.

Больше плохих новостей

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

6 голосов
/ 19 февраля 2014

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

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

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

1 голос
/ 04 ноября 2010

Согласно ответам на этот ТАК вопрос, это невозможно. Джон Сондерс говорит:

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

...