4 Stimmen

Wie kann ich Arrays einen anderen Namen als "Items" beim Generieren von C#-Code aus einem XSD-Schema haben?

Ich arbeite an einem Projekt, das eine Verbindung zu einigen alten Webservices herstellen muss, die einige hierarchische Daten für Anfragen und Antworten in einzelne Strings von hierarchischem XML packen.

Ich habe xsd.exe verwendet, um XSDs aus XML-Beispielfragmenten für Anfragen und Antworten zu generieren und sie bei Bedarf zu ändern, um die bestmögliche Definition zu erhalten, und xsd.exe erneut verwendet, um C#-Objekte zu generieren. Die Manager, die die Webservices aufrufen, können dann diese stark typisierten Request-Objekte als Parameter nehmen, sie in Strings serialisieren, um die Aufrufe zu tätigen, die Antworten als Strings zurückbekommen, sie in die stark typisierten Response-Objekte deserialisieren und diese zurückgeben.

Wenn ich, sagen wir, eine Liste von Strings habe, kann ich eine gültige XSD haben, die sie als einen komplexen Typ einer unbegrenzten xs:choice von xs:string-Elementen betrachtet, und dann wird sie einfach in ein String-Array deserialisiert, was schön und einfach zu handhaben ist. Das ärgerliche Problem ist, dass es aus irgendeinem Grund keine Möglichkeit zu geben scheint, das String-Array anders als " Artikel ". Ganz gleich was Ich füge dem Schema hinzu, dass xsd.exe keinen anderen Namen schreiben kann.

Hier ist ein Beispiel für ein XSD-Schema:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="AccountStatusRequest">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded" id="AccountRowIDs">
                <xs:element nillable="true" type="xs:string" id="AccountRowID" name="AccountRowID"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>

Und die daraus resultierende Klasse:

public partial class AccountStatusRequest {

    private string[] itemsField;

    [System.Xml.Serialization.XmlElementAttribute("AccountRowID", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
    public string[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

Ich habe versucht, so ziemlich jedes msdata:-Attribut in Intellisense sowohl für die Auswahl als auch für das innere Element hinzuzufügen, und nichts macht einen Unterschied.

Nur um der Argumentation willen habe ich ein paar zusätzliche ähnliche Auswahlmöglichkeiten zu diesem complexType hinzugefügt, um zu sehen, ob dies die Verwendung eines Namens für die String-Arrays erzwingen würde, aber stattdessen gab es mir Artikel , Artikel1 , Artikel2 ...

Ich möchte wirklich nicht, dass es ein Array eines eigenen Typs ist, das nur eine Zeichenkette enthält, aber ich möchte auch nicht, dass es " Artikel ", ohne xml-Kommentare (weiß jemand, wie man DAS zu einer xsd-Datei hinzufügt?), wenn sie einen beschreibenderen Namen haben sollte. Und ich kann sie definitiv nicht einfach manuell ändern, da der gewünschte Arbeitsablauf bei jeder Änderung der Webservice-Schemata darin besteht, die XSDs zu ändern und dann die Klassen aus ihnen neu zu generieren.

Dies scheint eine weitere Sache zu sein, die xsd.exe unterstützen sollte. Gibt es etwas, das ich übersehe? Sollte ich einen anderen Ansatz wählen? Oder gibt es ein alternatives Tool, das ich stattdessen verwenden kann und das weniger lahm ist?

7voto

Versuchen Sie, die Auswahl in eine Sequenz zu ändern, und setzen Sie die Min/Max-Ereignisse in das Element AccountRowID...

0voto

Marc Gravell Punkte 970173

Ich bin mir ziemlich sicher, dass dies eine Einschränkung von xsd.exe ist; Sie können benutzerdefinierte Ergebnisse in der anderen Richtung erhalten (class => xml/xsd), aber das hilft Ihnen nicht viel. Tut mir leid.

-1voto

RobS Punkte 9355

Edit: sorry ich habe die vorherige Antwort irgendwie übersehen - es hat bei mir funktioniert - hier ist das Schema, das ich verwendet habe und das Ergebnis. Meine ursprünglichen Antworten könnten auch angemessen sein.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="AccountStatusRequest" msdata:ColumnName="AccountList">
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded" id="AccountRowIDs">
              <xs:element nillable="true" type="xs:string" id="AccountRowID" name="AccountRowID"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>  
</xs:schema>

public partial class AccountStatusRequest {

    private string[] accountRowIDField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("AccountRowID", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]
    public string[] AccountRowID {
        get {
            return this.accountRowIDField;
        }
        set {
            this.accountRowIDField = value;
        }
    }
}

Hallo, ich habe das Schema etwas geändert und die Auswahl durch eine Liste ersetzt, die von einem simpleType und einem Attribut umschlossen wird, was die gewünschte Ausgabe (ein benanntes String-Array) erzeugt. Ich bin mir jedoch nicht sicher, ob das geänderte Schema für das, was Sie tun, geeignet ist?

Hier ist das geänderte Schema:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="AccountStatusRequest" msdata:ColumnName="AccountList">
        <xs:complexType>
          <xs:attribute name="AccountRowIDs">
            <xs:simpleType id="AccountRowID"  >
              <xs:list itemType="xs:string">                
              </xs:list>
            </xs:simpleType>       
          </xs:attribute>
        </xs:complexType>
    </xs:element>  
</xs:schema>

und die Ausgabe nach der Ausführung mit xsd.exe:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class AccountStatusRequest {

    private string[] accountRowIDsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string[] AccountRowIDs {
        get {
            return this.accountRowIDsField;
        }
        set {
            this.accountRowIDsField = value;
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X