Я работаю над проектом, который должен соединиться с некоторыми древними веб-сервисами, которые упаковывают некоторые иерархические данные для запросов и ответов в отдельные строки иерархического XML.
Я использую xsd.exe для генерации XSD-файлов из примеров XML-фрагментов запросов и ответов, изменяя их, где это необходимо, для лучшего определения, и снова используя xsd.exe для генерации объектов C #. Менеджеры, которые вызывают веб-сервисы, могут затем принимать эти строго типизированные объекты запроса в качестве параметров, сериализовать их в строки для выполнения вызовов, возвращать ответы в виде строк, десериализовать их в объекты ответа со строгой типизацией и возвращать их.
Если у меня есть, скажем, список строк, у меня может быть действительный XSD, который считает его сложным типом неограниченных элементов xs: choice элементов xs: string, а затем он просто десериализуется в массив строк, который приятно и просто иметь дело с Раздражающая проблема заключается в том, что по какой-то причине, кажется, нет никакого способа заставить его вызывать строковый массив как-нибудь иначе, чем " Items ". Неважно, что Я добавляю в схему, я не могу получить xsd.exe для записи любого другого имени.
Вот пример схемы XSD:
<?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>
И полученный класс:
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;
}
}
}
Я попытался добавить почти все атрибуты msdata: в intellisense как к выбору, так и к внутреннему элементу, и ничто не имеет значения.
Просто ради аргумента я добавил пару дополнительных похожих вариантов к этому complexType, чтобы посмотреть, не заставит ли это использовать имя для строковых массивов, но вместо этого он дал мне Items , Items1 , Items2 ...
Я действительно не хочу, чтобы это был массив своего собственного типа, который содержит только строку, но я также не хочу оставлять его под названием " Items ", без xml комментарии (кто-нибудь знает, как добавить ЭТО в xsd?), когда у него должно быть более описательное имя. И я определенно не могу просто изменить его вручную в качестве нужного рабочего процесса всякий раз, когда меняются схемы веб-сервиса, состоящие в том, чтобы изменить XSD и затем заново сгенерировать из них классы.
Это похоже на еще одну из тех вещей, которые должен поддерживать xsd.exe. Я что-то упускаю? Должен ли я принять другой подход как-то? Или есть альтернативный инструмент, который я мог бы использовать для этого, но менее хромой?