2

我整天都在为此苦苦挣扎。我做了很多研究,但我似乎无法将它们放在一起。

我有来自服务器的 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 元素?我只想让根说(用一个小“我”)。其次,为了快速测试,我只在第一个字段中输入了一个值。为什么其他字段没有作为空元素出现?我需要另一个装饰器吗?

谢谢!谢谢!

4

3 回答 3

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 元素的名称,以便您可以使用小写名称。

于 2013-01-30T22:22:17.630 回答
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不带额外内部元素的能力。

于 2013-01-30T22:23:58.427 回答
0

使用 从您的第一个示例 XML(然后是 .cs)生成 XSD 后xsd.exe,我可以从您的第二个示例创建并序列化一个实例:

<?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>

除了编码属性和模式命名空间之外,这看起来与第一个示例非常相似。

于 2013-01-30T22:33:14.433 回答