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; }
    }
}

上記のクラスは、私がオンラインで見つけた数多くの例の1つに基づいています。問題は、上記のクラスをシリアル化すると(それが正しいことを確認するために)、次のようになります。

<?xml version="1.0" encoding="utf-16"?>
<inboxRecords>
  <InboxRecords>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
    <InboxRecord>
      <field1>some value</field1>
    </InboxRecord>
  </InboxRecords>
</inboxRecords>

それで、最初の問題は、どうすれば余分なInboxRecords要素を取り除くことができますか?私はルートにそれを言わせたいだけです(小さな「i」で)。次に、簡単にテストするために、最初のフィールドに値を入力するだけです。他のフィールドが空の要素として表示されなかったのはなぜですか?そのために別のデコレータが必要ですか?

ありがとう!ありがとう!

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; }
    }
}

これにより、配列ラッパー要素が削除され、各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、2番目の例からインスタンスを作成してシリアル化できます。

<?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 に答える