2009-03-18 1 views
4

Ich arbeite an einem Projekt, das sich mit einigen alten Webservices verbinden muss, die einige hierarchische Daten für Anfragen und Antworten in einzelne Strings von hierarchischem XML packen.Wie kann ich Arrays dazu bringen, einen anderen Namen als "Items" zu haben, wenn ich C# -Code aus einem XSD-Schema erzeuge?

Ich habe xsd.exe verwendet, um XSDs aus XML-Fragmenten für Beispielanforderungen und -antworten zu generieren, diese gegebenenfalls zu ändern, um die bestmögliche Definition zu erhalten, und xsd.exe erneut zum Generieren von C# -Objekten zu verwenden. Die Manager, die die Webdienste aufrufen, können dann diese stark typisierten Anforderungsobjekte als Parameter verwenden, sie in Zeichenfolgen serialisieren, um die Aufrufe auszuführen, die Antworten als Zeichenfolgen zurückgeben, sie in die stark typisierten Antwortobjekte deserialisieren und diese zurückgeben.

Wenn ich, sagen wir, eine Liste von Zeichenfolgen habe, kann ich eine gültige XSD haben, die es als einen komplexen Typ einer unbegrenzten xs: Auswahl von xs: string -Elementen betrachtet, und dann wird es einfach zu einem String-Array deserialisiert. Das ist schön und einfach zu bewältigen. Das lästige Problem ist, dass es aus irgendeinem Grund keine Möglichkeit gibt, das String Array anders als "Items" aufzurufen. Egal was Ich füge zum Schema hinzu, ich kann nicht xsd.exe, um einen anderen Namen zu schreiben.

Hier ist ein Beispiel 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 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 ziemlich viel versucht haben, das Hinzufügen alle msdata: Attribut in intellisense sowohl für die Wahl und das innere Element und nichts macht einen Unterschied.

Nur aus Gründen der Argumentation, habe ich ein paar zusätzliche ähnliche Entscheidungen zu diesem complex, zu sehen, ob es zwingen würde, einen Namen für das String-Arrays zu verwenden, sondern es gab mir Artikel, Posten1, effekten2 ...

ich wirklich nicht will, dass es eine Reihe von seinem eigenen Typ zu haben zu sein, die nur einen String hält, aber ich will nicht, dass auch wirklich lassen sie es "Artikel genannt ", ohne XML-Kommentare (weiß jemand, wie man THOSE zu einem xsd hinzufügt?), wenn es einen aussagekräftigeren Namen haben sollte. Und ich kann es definitiv nicht einfach manuell als den gewünschten Workflow ändern, wenn sich die Webdienst-Schemas ändern, um die XSDs zu ändern und dann die Klassen von ihnen neu zu generieren.

Dies scheint wie ein anderes dieser Dinge, die xsd.exe unterstützen sollte. Gibt es etwas, das mir fehlt? Soll ich irgendwie anders vorgehen? Oder gibt es stattdessen ein alternatives Tool, das weniger lahm ist?

Antwort

-1

Edit: sorry ich irgendwie die vorherige Antwort verpasst - es ist für mich gearbeitet - hier ist das Schema I verwendet und die 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; 
     } 
    } 
} 

da Hallo, ich änderte das Schema etwas von einem Simple und ein Attribute der Wahl mit einer Liste gewickelten Substitution, die die gewünschten Ausgabe erzeugt (eine benannter String-Array). Ich bin mir jedoch nicht sicher, ob das geänderte Schema für das geeignet ist, was Sie tun.

Hier ist das modifizierte 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, nachdem es mit xsd.exe läuft:

[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; 
     } 
    } 
} 
0

Ich bin ziemlich sicher, dass das 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. Es tut uns leid.

7

Versuchen Wahl Reihenfolge zu ändern, und legen Sie die min/max in dem Element AccountRowID auftritt ...

+1

Leider nicht sicher, wie ich diese Antwort verpasst - es funktionierte für mich +1 – RobS

Verwandte Themen