Любой способ переопределить привязку элемента <choice>к xsd.exe - PullRequest
3 голосов
/ 15 апреля 2010

В моей схеме есть следующие элементы:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="optimizeModelBase">
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="riskModel">
    <xs:complexContent>
      <xs:extension base="optimizeModelBase">
        <xs:attribute name="type" type="xs:string" use="required"/>        
      </xs:extension>      
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="fullCovariance">
    <xs:complexContent>
      <xs:extension base="optimizeModelBase">
        <xs:attribute name="fromDate" type="xs:date" use="required"/>
        <xs:attribute name="toDate" type="xs:date" use="required"/>
        <xs:attribute name="windowSize" type="xs:int" use="required"/>
      </xs:extension>
    </xs:complexContent>    
  </xs:complexType>

В основном теле схемы я использую элемент для указания 1-ситуации:

<xs:choice id="RiskModelParameter">
  <xs:element name="RiskModel" type="riskModel"/>
  <xs:element name="FullCovariance" type="fullCovariance"/>
</xs:choice>

Когда я запускаю xsd.exe, в результате получается код:

    [System.Xml.Serialization.XmlElementAttribute("FullCovariance",
    typeof(fullCovariance))]
    [System.Xml.Serialization.XmlElementAttribute("RiskModel", 
    typeof(riskModel))]
    public optimizeModelBase Item 
    {
        get 
        {
           return this.itemField;
        } 
        set 
        {
            this.itemField = value;
        }
    }

Проблема заключается в том, что тег ID элемента игнорируется, а xsd.exe произвольно называет свойство «Item». Я должен признать, это не большая проблема, но это начинает раздражать меня. Что делает этот дополнительный раздражает то, что если у меня есть дополнительные элементы на том же уровне, xsd.exe связывает их как «Item1», «Item2» и т. Д.

Кто-нибудь знает, возможно ли , а не , чтобы xsd.exe назвал мои выбранные элементы как "Элемент", и вместо этого мог бы добавить мои собственные имена свойств?

Ответы [ 5 ]

3 голосов
/ 16 апреля 2010

Я искал все выше и ниже, но, похоже, решения моей проблемы не существует. По ссылке:

http://msdn.microsoft.com/en-us/library/sa6z5baz(VS.80).aspx Кажется, что произвольное присвоение имени элементу выбора не , который можно переопределить. Надеюсь, эта информация будет полезна для других ...!

1 голос
/ 14 сентября 2015

Для тех, кто все еще хочет знать: просто используйте XSDObjectGenerator (производства Microsoft). Он управляет XsdChoice, добавляя один объект для каждого выбора в ваш класс. Таким образом, вам не нужно искать правильный элемент для использования в свойстве Item. Например:

<xs:complexType name="AccountSchemeName1Choice">
    <xs:sequence>
        <xs:choice>
            <xs:element name="Cd" type="ExternalAccountIdentification1Code"/>
            <xs:element name="Prtry" type="Max35Text"/>
        </xs:choice>
    </xs:sequence>
</xs:complexType>

стало

[XmlType(TypeName = "AccountSchemeName1Choice", Namespace = Declarations.SchemaVersion), Serializable]
public class AccountSchemeName1Choice : INotifyPropertyChanged
{

    [XmlElement(ElementName = "Cd", IsNullable = false, Form = XmlSchemaForm.Qualified, DataType = "string", Namespace = Declarations.SchemaVersion)]
    public string __Cd;

    [XmlIgnore]
    public string Cd
    {
        get { return __Cd; }
        set { __Cd = value; RaisePropertyChanged("Cd"); }
    }

    [XmlElement(ElementName = "Prtry", IsNullable = false, Form = XmlSchemaForm.Qualified, DataType = "string", Namespace = Declarations.SchemaVersion)]
    public string __Prtry;

    [XmlIgnore]
    public string Prtry
    {
        get { return __Prtry; }
        set { __Prtry = value; RaisePropertyChanged("Prtry"); }
    }

    public AccountSchemeName1Choice()
    {
    }

    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
0 голосов
/ 03 июля 2013

Только сегодня была именно эта проблема.

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

используя вышеуказанный xsd в качестве основы:

Перепишите:

<xs:choice id="RiskModelParameter">
  <xs:element name="RiskModel" type="riskModel"/>
  <xs:element name="FullCovariance" type="fullCovariance"/>
</xs:choice>

Кому:

<xs:group name="RiskModelGroup">
    <xs:sequence>
        <xs:element name="RiskModel" type="riskModel"/>
        <xs:element name="FullCovariance" type="fullCovariance"/>
    </xs:sequence>
</xs:group>

Ссылка на группу в вашем элементе:

<xs:element name="Foo">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="SomeFieldId" type="xs:int" />
      <xs:group ref="RiskModelGroup" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
    </xs:complexType>
</xs:element>

Запустите xsd.exe, и результат будет следующим:

public partial class Foo {

    private int someFieldIdField;

    private riskModel riskModelField;

    private fullCovariance fullCovarianceField;

    /// <remarks/>
    public int SomeFieldId {
        get {
            return this.someFieldIdField;
        }
        set {
            this.someFieldIdField = value;
        }
    }

    /// <remarks/>
    public riskModel RiskModel {
        get {
            return this.riskModelField;
        }
        set {
            this.riskModelField = value;
        }
    }

    /// <remarks/>
    public fullCovariance FullCovariance {
        get {
            return this.fullCovarianceField;
        }
        set {
            this.fullCovarianceField = value;
        }
    }
}

Теперь у вас есть имена свойств RiskModel и FullCovariance

Foo f = new Foo()
f.RiskModel.name

или

f.FullCovariance.fromDate

Если вам требуется несколько объектов Items RiskModels и FullCovariance, вы можете добавить в последовательность новый элемент, имеющий RiskModelGroup.

Удачи!

0 голосов
/ 17 января 2011

Я сам только что столкнулся с этим ограничением в моих отношениях с XSD.exe. Похоже, что это довольно единообразная практика в отношении того, как XSD.exe интерпретирует атрибут ID для всех типов элементов. Я хотел бы услышать от кого-то из команды разработчиков MS, почему XSD.exe работает таким образом. Интересно то, что я работал над SchemaImporterExtension, который, помимо прочего, использовал бы атрибут ID выбранных элементов для достижения именно того, что вы описываете, средства настройки имен полей / свойств выбранных членов отображаемых объектов. К сожалению, не только кажется, что XSD.exe не поддерживает привязку атрибута ID, но даже не кажется, что ID включен в объект XmlSchemaChoice, который отражает элемент выбора из разобранного документа схемы. Возможно, я что-то упускаю, но если это действительно намеченное поведение, а не ошибка с моей стороны, то это довольно нелепое упущение в моей оценке, и оно говорит о том, сколько именно кастрированного представления XSD отражено в MS инструменты автоматической генерации схемы. XSD.exe придерживается того, что я буду называть «скудной и подлой» интерпретацией стандарта XML-схемы. Видимо, теперь WCF устраняет XSD.exe, и знаете что? Инструмент WCF svcutil распознает даже меньший след XML-схемы; Выбор связывания элементов даже не поддерживается в svcutil IIRC. В какой-то момент я даже не уверен, какое значение инструменты автогенерации MS будут вносить в таблицу, потому что вы будете сокращены до использования тривиальных структур XSD (я имею в виду, нет поддержки выбора элементов? инкапсулировать моделирование вашего бизнес-объекта.

0 голосов
/ 09 августа 2010

Однажды я фактически проанализировал автоматически сгенерированный файл xsd.exe и изменил его с помощью NRefactory.

...