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?