我有一个XSD,并使用xsd.exe工具创建c#类。在Web服务中,我在MessageContract中接受了这些创建对象之一的实例。
这个问题的xsd的相关部分在这里:
<xs:element name="Tasks">
<xs:complexType>
<xs:sequence>
<xs:element ref="Task" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Task"> ... </xs:element>
xsd创建了这个:
/// <remarks/>
[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 Tasks {
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Task")]
public Task[] Task;
}
/// <remarks/>
[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 Task { ... }
SOAPUI从WSDL创建了一个SOAP请求,如下所示:
<Tasks>
<Task>
<Task>
.. task data here
</Task>
</Task>
</Tasks>
注意额外的包装元素。当尝试运行该soap请求时,我得到一个反序列化错误:行x位置y的错误:'Element''WWW'来自名称空间'ZZZ'不是预期的。期待元素'SSS'
在生成的SOAP请求中找到无关节点后,我将新请求看起来如下:
<Tasks>
<Task>
...task data here
</Task>
</Task>
现在反序列化器'工作',但在我的方法中,Tasks对象包含一个空的Task数组。
所以我的问题是:为什么自动请求生成器创建包装器Task对象,为什么当我删除它时,我在Tasks对象中得到一个空数组?
答案 0 :(得分:1)
如果更改了类和属性名称,您可能会找到答案,因此它们不是全部Task
和Tasks
。
一眼就看出来了:
<Tasks> <-- the root element for your Tasks class. public partial class Tasks
<Task> <-- the Task property of your Tasks class. public Task[] Task
<Task> <-- The first serialized task
.. task data here
</Task>
<Task> <-- The second serialized task
.. second task data here
</Task
</Task>
</Tasks>
另一种看待它的方法是比较您在Task
班级的Task
集合中访问Tasks
的方式:
var myTasks = new Tasks(); // An instance of your Tasks class
var myTasksTasks = myTasks.Task; // accessing the `Task[]` property of your `Tasks` class
var myFirstTask = myTasks.Task[0]; // accessing the first Task instance within the Task[] array of your Tasks class