我整天都在苦苦挣扎。我做了很多研究,但我似乎无法将它们放在一起。
我有来自服务器的XML响应:
<?xml version="1.0" ?>
<inboxRecords>
<inboxRecord>
<field1 />
<field2 />
<field3 />
</inboxRecord>
<inboxRecord>
<field1 />
<field2 />
<field3 />
</inboxRecord>
</inboxRecords>
我创建了以下代码来表示响应。目的是我将使用以下内容对反应进行反序列化:
[XmlRoot("inboxRecords")]
public sealed class QueueQueryResult
{
public InboxRecord[] InboxRecords;
public QueueQueryResult()
{
InboxRecords = null;
}
public sealed class InboxRecord
{
public string field1 { get; set; }
public string field2 { get; set; }
public string field3 { get; set; }
}
}
上述课程基于我在网上找到的众多例子之一。问题是,当我序列化上面的类(以确认它是正确的)时,它出现如下:
<?xml version="1.0" encoding="utf-16"?>
<inboxRecords>
<InboxRecords>
<InboxRecord>
<field1>some value</field1>
</InboxRecord>
<InboxRecord>
<field1>some value</field1>
</InboxRecord>
</InboxRecords>
</inboxRecords>
所以,第一个问题,如何摆脱额外的InboxRecords元素?我只想让根说(用小'我')。其次,为了快速测试,我只将值放在第一个字段中。为什么其他领域不是空元素?我需要另一个装饰器吗?
谢谢! 谢谢!
答案 0 :(得分:3)
使用XmlElement
属性:
[XmlRoot("inboxRecords")]
public sealed class QueueQueryResult
{
[XmlElement("inboxRecord")]
public InboxRecord[] InboxRecords;
public QueueQueryResult()
{
InboxRecords = null;
}
public sealed class InboxRecord
{
public string field1 { get; set; }
public string field2 { get; set; }
public string field3 { get; set; }
}
}
这将删除Array包装器元素,并允许您控制每个xml元素的名称,以便您可以使用小写名称。
答案 1 :(得分:1)
未经测试,但我认为你可能会做这样的事情:
[XmlRoot("inboxRecords")]
public sealed class QueueQueryResult : Collection<QueueQueryResult.InboxRecord>
{
public QueueQueryResult()
{
InboxRecords = null;
}
public sealed class InboxRecord
{
public string field1 { get; set; }
public string field2 { get; set; }
public string field3 { get; set; }
}
}
您的代码存在的问题是,您在序列化为InboxRecords
的对象中有一个成员inboxRecords
。通过使类继承自Collection
,您可以为其提供处理一组InboxRecords
而无需额外内部元素的功能。
答案 2 :(得分:0)
使用xsd.exe
从第一个样本XML(然后是.cs)生成XSD后,我可以从第二个示例中创建并序列化一个实例:
<?xml version="1.0" encoding="utf-16"?>
<inboxRecords xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<inboxRecord>
<field1>some value</field1>
</inboxRecord>
<inboxRecord>
<field1>some value</field1>
</inboxRecord>
</inboxRecords>
除了encoding属性和schema命名空间之外,这看起来非常类似于第一个示例。