我正在开发一个项目,该项目必须连接到一些古老的 web 服务,这些服务将一些用于请求和响应的分层数据打包到分层 XML 的单个字符串中。
我一直在使用 xsd.exe 从示例请求和响应 XML 片段生成 XSD,在必要时修改它们以获得最佳定义,并再次使用 xsd.exe 生成 C# 对象。然后,调用 Web 服务的管理器可以将那些强类型请求对象作为参数,将它们序列化为字符串以进行调用,将响应作为字符串返回,将它们反序列化为强类型响应对象并返回这些对象。
如果我有一个字符串列表,我可以有一个有效的 XSD,它认为它是一个无界 xs:choice of 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: 属性添加到选择和内部元素,但没有任何区别。
只是为了论证,我向那个 complexType 添加了几个额外的类似选项,看看这是否会强制它使用字符串数组的名称,但它给了我 Items、Items1、Items2...
我真的不希望它必须是一个自己类型的数组,它只包含一个字符串,但我也真的不想让它被称为“项目”,没有 xml 注释(有谁知道如何添加 THOSE到 xsd?),什么时候它应该有一个更具描述性的名称。而且我绝对不能只是手动更改它,因为每当 Web 服务模式更改时,所需的工作流就是更改 XSD,然后从它们重新生成类。
这似乎是 xsd.exe 应该支持的另一种东西。有什么我想念的吗?我应该以某种方式采取不同的方法吗?或者有没有我可以使用的替代工具而不是那么蹩脚?
最佳答案
尝试将选择更改为序列,并将最小值/最大值出现在 AccountRowID 元素中...
关于.net - 从 XSD 模式生成 C# 代码时,如何使数组具有 "Items"以外的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/660533/